Ios 谓语;在;设备速度非常慢(相差83倍)
我有一个谓词 谓词=[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排序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
新的查询大约使用了1.8秒。虽然有所改进,但速度仍然很慢。它应该是这么慢吗 第一次查询的速度慢很可能是由左外连接造成的 根据您报告的数据库大小,我认为1.8秒的速度非常快,尤其是在iPhone 3G上
如果这还不够快,我建议使用较低级别的数据库框架,它将允许您直接操作数据库的模式,并使用其他工具加快查询速度。谢谢您的帮助。解决了这个问题
注意:添加新索引后,解释查询计划仍然显示它使用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