我有一个谓词
谓词= NSPredicate谓词NSPredicate:@“character.id IN %@",索引;
它生成以下SQL:
CoreData: sql:选择t0.Z_ENT,t0.Z_PK,t0.Z_OPT,t0 . t0.ZMEANING,t0.CoreData,t0. ZCHARACTER,t0. t0.ZSTROKECOUNT,t0.ZCHARACTER,t0. t0.ZFREQUENCY,t0. WHERE,t0. t0.ZJLPTLEVEL,t0. t0.ZREADING,t0.t0.ZMEANING,t0. t0.ZROMAN,t0. t0.ZHWUN,t0.t0.ZHWUN,t0. t0.ZPHONETICID,t0. ZCHARACTERINFO t0外部加入ZCHARACTER t1 ON 0?t0.Z_ENT = ?)按t0. t0.ZSTROKECOUNT,T1. t1.ZUNICODE排序
在模拟器中,我得到了以下结果:
CoreData: CoreData: sql时间: 0.0478s CoreData:注释:7行的总获取执行时间: 0.0483s。
设备上的VS (iPhone 3G)
CoreData: CoreData: sql时间: 3.9627s CoreData:注释:7行的总获取执行时间:3.9789 s。
SQLite解释查询计划显示我正在使用索引(ZID在模型中定义了索引):
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在数据库中,字符表中有20,900行,字符信息表中有62,000行。
我想知道为什么设备速度这么慢。我漏掉了什么吗?有什么方法可以改进吗?谢谢。
更新:i怀疑连接是问题所在。因此,我尝试将t1.ZID移动到t0表中,以便可以去掉联接表。新的查询如下:
从(?,?,?)t0.Z_ENT = ?)按t0. t0.ZSTROKECOUNT定单
新的查询大约使用1.8s。它得到了改进,但似乎仍然很慢。应该是这么慢吗?
发布于 2011-06-19 14:10:51
您的第一个查询的慢点很可能来自左外部联接。
根据您报告的数据库大小,我认为1.8秒非常快,特别是在iPhone 3G上。
如果这还不够快,我建议使用更低级别的db框架,它将允许您直接操作db的模式,并使用其他工具来加快查询速度。
发布于 2011-06-20 17:40:39
谢谢你的帮助。解决了这个问题。
,
注意:添加新索引之后,解释查询计划仍然显示它使用Z_ENT索引。必须删除Z_ENT索引,以便可以使用CID_Z_ENT_INDEX。不知道为什么。
https://stackoverflow.com/questions/6401102
复制相似问题