2015-09-25 32 views
0

刚开始用Xcode版本7.0(7A220)完全测试我们的应用程序。它大量使用SQLite,大量查询,插入,更新和使用视图等。它是一个产品定价工具,它有很多行迭代,因此可以提供优惠以及各种规则和依赖关系。当被问到时它确实做了很多。在Xcode 6下,支持iOS8,性能很好。瞬间没有问题。当运行相同的应用程序,实际编译为iOS8,并且已经安装在iOS9之前的iPad上时,它运行时就像一只蜗牛。SQLite在iOS9下运行“一些”查询,查看速度比iOS8慢很多

所以它绝对是iOS9。这是唯一不同的。所以,回到Xcode 7,我开始调试。代码中的哪些地方,是否坚持或性能受到影响?我已经隔离了对查询的坚持,缓慢。这是一个观点,一个非常复杂的观点,然而,它在iOS8上运行得非常快。它的规模相当大,如果问了我会发布它,但我的主要问题是...有什么我需要注意的iOS9和SQLite性能?事实上,我很困惑问题是什么。我试图消除:

sqlite3.dylib 

并与出现在Xcode 7船库替换它:

libsqlite3.0.tbd 

然后

libsqlite3.tbd 

但无论是帮助。

仍然运行非常缓慢。

任何任何想法?

+0

尝试使用Xcode 6.4附带的sqlite3.dylib。 – rmaddy

+0

您可以发布仪器跟踪吗? – quellish

回答

1

OK-谢谢,以上建议。我看了一下Instruments Trace,但这并不是真的必要,因为调试告诉我运行速度慢的确切查询。

但我的问题的关注,为什么它是从iOS8上移动到iOS9将导致查询优化器以不同的方式评估相同的查询。它绝对如此。为了完整性,我自己回答了这个问题,因为我已经解决了这个问题。但是,只是因为我不得不重新调整SQL以适应优化器现在正在做的任何事情。

有趣的是,使用中的相同SQLite库并没有改变。所以,我仍然不知道为什么迁移到iOS9会给我带来这个问题。在下面,查询。我不希望任何人理解它,只要说句法是可以理解的即可。但是,我改变查询的方式是从一个嵌套选择中取出一个SELECT(或替换)。

这几乎就好像SQLite不喜欢iOS9下嵌套查询的深度。当然这没有意义。但这是我观察到的。

NSString *view = @" CREATE VIEW IF NOT EXISTS OFF_VIEW_5_FIXED_AMT_OFF AS " 
     " SELECT OTV_OOL_OOH_SEQ_NO   AS R_OOL_OOH_SEQ_NO, " 
     "  OTV_OOL_SEQ_NO    AS R_OOL_SEQ_NO, " 
     "  OTV_OO_SEQ_NO    AS R_OO_SEQ_NO, " 
     "  AMOUNT_DUE     AS R_OOL_TOTAL_SAVINGS, " 
     "  TOTAL_PAYABLE_WITHOUT_OFFER AS R_OOL_TOTAL_PAYABLE_NO_OFFER, " 
     "  CASE " 
     "   WHEN (100.00/TOTAL_PAYABLE_WITHOUT_OFFER * AMOUNT_DUE) > 100.00 THEN " 
     "   100.00 " 
     "   ELSE " 
     "   (100.00/TOTAL_PAYABLE_WITHOUT_OFFER * AMOUNT_DUE) " 
     "  END       AS R_OOL_PICKED_PERC_OFF_ALL_ORD, " 
     "  CASE " 
     "   WHEN SUM(OFFER_PAYABLE_BY_LINE) < 0 THEN " 
     "   0.00 " 
     "   ELSE " 
     "   SUM(OFFER_PAYABLE_BY_LINE) " 
     "  END       AS R_OFFER_TOTAL_PAYABLE_BY_LINE " 
     " FROM (SELECT OTV_OOL_SEQ_NO, " 
     "    OTV_OO_SEQ_NO, " 
     "    OTV_OOL_OOH_SEQ_NO, " 
     "    (CASE " 
     "     WHEN OO_ORD_VAL_BASED_ON_PERC_YN = 'Y' THEN " 
     "     TOTAL_PAYABLE_WITHOUT_OFFER - (TOTAL_PAYABLE_WITHOUT_OFFER/100.00 * ORDER_TOTAL_TRIGGER) " 
     "     ELSE " 
     "     CASE " 
     "      WHEN OO_DISCOUNT_ENTIRE_ORDER_YN = 'Y' THEN " 
     "      ORDER_TOTAL_TRIGGER " // -- * -1 -- When actioned, this needs to be taken off the order, perhaps defined as a negative amount. 
     "      ELSE " 
     "      TOTAL_PAYABLE_WITHOUT_OFFER - ORDER_TOTAL_TRIGGER " 
     "     END " 
     "    END) * (100.00/TOTAL_PAYABLE_WITHOUT_OFFER * OTV_OOL_UNIT_PRICE)/100.00 AS OFFER_PAYABLE_BY_LINE, " 
     "    TOTAL_PAYABLE_WITHOUT_OFFER, " 
     "    ORDER_TOTAL_TRIGGER AS AMOUNT_DUE " 

     "   FROM (SELECT OTV_OOL_SEQ_NO, " 
     "      OTV_OO_SEQ_NO, " 
     "      OTV_OO_OFFER_ID, " 
     "      OTV_OOL_OOH_SEQ_NO, " 
     "      OTV_OOL_UNIT_PRICE, " 
     "      TOTAL_PAYABLE_WITHOUT_OFFER, " 
     "      OO_ORD_VAL_BASED_ON_PERC_YN, " 
     "      OO_DISCOUNT_ENTIRE_ORDER_YN, " 
     "      OTV_TRIG_VAL_ON_ENTIRE_ORD_YN, " 
     "      TOTAL_SALES_VALUE_ALL_ORDER, " 

     "      (SELECT OAOBOV_AMOUNT_OFF " 
     "       FROM OFF_AMOUNT_OFF_BY_ORDER_VALUE " 
     "       WHERE OAOBOV_OO_SEQ_NO = OTV_OO_SEQ_NO " 
     "       AND OAOBOV_TRIGGER_VALUE = " 

     "       (SELECT MAX(OAOBOV_TRIGGER_VALUE) " 
     "        FROM OFF_AMOUNT_OFF_BY_ORDER_VALUE " 
     "        WHERE OAOBOV_TRIGGER_VALUE <= CASE " 
     "          WHEN OTV_TRIG_VAL_ON_ENTIRE_ORD_YN = 'Y' THEN " 
     "          TOTAL_SALES_VALUE_ALL_ORDER " 
     "          ELSE " 
     "          TOTAL_PAYABLE_WITHOUT_OFFER " 
     "          END " 
     "        AND OAOBOV_OO_SEQ_NO = OTV_OO_SEQ_NO)) AS ORDER_TOTAL_TRIGGER " 

     "     FROM (SELECT OTV_OOL_SEQ_NO, " 
     "         OTV_OO_OFFER_ID, " 
     "         OTV_OO_SEQ_NO, " 
     "         OTV_OOL_OOH_SEQ_NO, " 
     "         OTV_OOL_UNIT_PRICE, " 
     "         OO_ORD_VAL_BASED_ON_PERC_YN, " 
     "         OO_DISCOUNT_ENTIRE_ORDER_YN, " 
     "         OTV_TRIG_VAL_ON_ENTIRE_ORD_YN, " 
     "        (SELECT SUM(OTV_OOL_UNIT_PRICE) FROM OFF_TEMP_5) AS TOTAL_PAYABLE_WITHOUT_OFFER, " 
     "         CASE " 
     "         WHEN OTV_USE_ORD_VAL_AFTER_DISC_YN = 'Y' THEN " 
     /* 
     "          (SELECT SUM(OOL_PICKED_PRICE) " 
     "          FROM OFF_ORDER_LINES " 
     "          WHERE OOL_OOH_SEQ_NO = OTV_OOL_OOH_SEQ_NO " 
     "           AND OOL_SEQ_NO NOT IN " 
     "           (SELECT OOL_OOL_SEQ_NO " 
     "            FROM OFF_CHOICE_LOCKED_CORES, " 
     "             OFF_ORDER_LINES " 
     "            WHERE OCLC_OOH_SEQ_NO = OTV_OOL_OOH_SEQ_NO " 
     "            AND OCLC_OOL_SEQ_NO = OOL_SEQ_NO " 
     "            AND OOL_DISCOUNT_ENTIRE_ORDER_YN = 'N')) " 
     */ 
     "          (SELECT OTAOV_AFTER_OFFER_ORDER_VALUE FROM OFF_TEMP_AFTER_OFFER_VALUE) " 

     "         ELSE " 
     "          (SELECT SUM(OOL_UNIT_PRICE * OOL_QTY) " 
     "          FROM OFF_ORDER_LINES OOL " 
     "          WHERE OOL_OOH_SEQ_NO = OTV_OOL_OOH_SEQ_NO " 
     "           AND OOL.OOL_LINE_TYPE_ID = 'S') " 
     "         END            AS TOTAL_SALES_VALUE_ALL_ORDER " 
     "       FROM OFF_TEMP_5)) " 
     "     WHERE ORDER_TOTAL_TRIGGER IS NOT NULL) " 

     "  GROUP BY OTV_OOL_OOH_SEQ_NO, " 
     "     OTV_OOL_SEQ_NO, " 
     "     AMOUNT_DUE, " 
     "     TOTAL_PAYABLE_WITHOUT_OFFER, " 
     "     OTV_OO_SEQ_NO "; 

因此,/ *和* /之间的灰色部分是我拿出来的。

这...

(SELECT OTAOV_AFTER_OFFER_ORDER_VALUE FROM OFF_TEMP_AFTER_OFFER_VALUE) 

...是我与取代它。在我运行视图之前,我在上面的表中插入一行,一行,一列,然后从中选择。所以实质上,我删除了在引号中运行查询的需要。

所以,我想所有这一切的结尾,对于遇到类似问题的任何人来说,我都在追查复杂性。但我仍然困惑于为什么它在iOS8,Xcode 6.x上完全正常。

也许它会帮助别人。

相关问题