Ios 谓语;在;设备速度非常慢(相差83倍)

Ios 谓语;在;设备速度非常慢(相差83倍),ios,core-data,Ios,Core Data,我有一个谓词 谓词=[NSPredicate predicateWithFormat:@“character.id IN%@”,indexs] 它生成以下SQL: 核心数据:sql:选择t0.Z_ENT、t0.Z_PK、t0.Z_OPT、t0.ZCHARACTERID、t0.ZMEANING、t0.ZREADING、t0.ZRADICAL、t0.ZSTROKECOUNT、t0.ZCHARACTER、t0.ZFREQUENCY、t0.ZGRADE、t0.ZJLPTLEVEL、t0.Zkunadin

我有一个谓词

谓词=[NSPredicate predicateWithFormat:@“character.id IN%@”,indexs]

它生成以下SQL:

核心数据:sql:选择t0.Z_ENT、t0.Z_PK、t0.Z_OPT、t0.ZCHARACTERID、t0.ZMEANING、t0.ZREADING、t0.ZRADICAL、t0.ZSTROKECOUNT、t0.ZCHARACTER、t0.ZFREQUENCY、t0.ZGRADE、t0.ZJLPTLEVEL、t0.Zkunading、t0.Zhumening、t0.ZROMAN、t0.Zhuun、t0.ZhunUnmore、,来自ZCHARACTERINFO t0的t0.Z拼音ID在t0.ZCHARACTER=t1.Z_PK上左外连接ZCHARACTER t1,其中(t1.ZID IN(?,,,,,,,,,,?)和t0.Z_ENT=?)按t0.ZSTROKECOUNT,t1.Zunocode排序

在模拟器中,我得到了以下结果:

CoreData:注释:sql连接获取时间:0.0478s CoreData:注释:7行的总提取执行时间:0.0483s

设备上的VS(iPhone 3G)

CoreData:注释:sql连接获取时间:3.9627s CoreData:注释:7行的总提取执行时间:3.9789s

SQLite解释查询计划显示我正在使用索引(ZID在模型中定义了索引):

在数据库中,character表中有20900行,characterinfo表中有62000行

我想知道为什么它在设备上这么慢。我错过什么了吗?有改进的方法吗?谢谢

更新: 我怀疑加入是个问题。所以我尝试将t1.ZID移动到t0表中,这样就可以摆脱连接表。新查询变成:

从ZCHARACTERINFO t0中选择t0.Z_ENT,t0.Z_PK,其中(t0.ZCHARACTERID IN(?,,,,,,,,,,?)和t0.Z_ENT=?)按t0.ZSTROKECOUNT排序


新的查询大约使用了1.8秒。虽然有所改进,但速度仍然很慢。它应该是这么慢吗

第一次查询的速度慢很可能是由左外连接造成的

根据您报告的数据库大小,我认为1.8秒的速度非常快,尤其是在iPhone 3G上


如果这还不够快,我建议使用较低级别的数据库框架,它将允许您直接操作数据库的模式,并使用其他工具加快查询速度。

谢谢您的帮助。解决了这个问题

  • 连接非常慢。消除了连接,时间降低到1.8~2s。(见以上更新)
  • 查询未使用索引或仅在Z_ENT上使用索引。对于ZCHARACTERID,它仍然执行完整的表扫描。因此,我添加了“在ZCHARACTERINFO(ZCHARACTERID,Z_ENT)上创建索引CID_Z_ENT_INDEX”,查询时间减少到0.05秒

  • 注意:添加新索引后,解释查询计划仍然显示它使用Z_ENT索引。必须删除Z_ENT索引才能使用CID_Z_ENT_索引。不确定原因。

    我不是DBA,所以不能对性能发表评论。我知道,中的
    子句有时可以用联接替换,并且可能对t下的临时表使用联接他掩护。谢谢梅林。请看我上面的更新。
    
    selectid    order       from        detail                                                                                      
    ----------  ----------  ----------  ---------------------------------------------------------------------------------------------
    0           0           0           SEARCH TABLE ZCHARACTERINFO AS t0 USING INDEX ZCHARACTERINFO_Z_ENT_INDEX (Z_ENT=?) (~10 rows)
    0           1           1           SEARCH TABLE ZCHARACTER AS t1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)                 
    0           0           0           EXECUTE LIST SUBQUERY 1                                                                     
    0           0           0           USE TEMP B-TREE FOR ORDER BY                                                                
    CPU Time: user 0.000395 sys 0.000184