2

我正在开发一个 iOS 7 应用程序,该应用程序使用与 SQLite 商店保持一致的 Core Data。我正在尝试优化阅读。

我一直在遵循这篇博文中的建议,其中建议使用复合索引,该索引将包括在 where 子句和慢查询的 order by 子句中使用的列。但是,我的一个查询是根据子查询中的 Core Data 托管主键使用 where 子句进行选择:

SELECT 0, t0.Z_PK, t0.Z_OPT, ... FROM ZMODEL t0 
WHERE t0.Z_PK IN (SELECT * FROM _Z_intarray0)  
ORDER BY t0.ZTITLE LIMIT 99999

我无法让 SQLite 准确地为我解释查询,因为_Z_intarray0它是一个临时表(或者是它吗?),但我可以将一些值替换为(可能)从数据库中获得一些指导:

explain query plan SELECT 0, t0.Z_PK, t0.Z_OPT, ... FROM ZMODEL t0 
                   WHERE  t0.Z_PK IN (1,2,3)  
                   ORDER BY t0.ZTITLE LIMIT 99999;
0|0|0|SEARCH TABLE ZMODEL AS t0 USING INTEGER PRIMARY KEY (rowid=?) (~3 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|USE TEMP B-TREE FOR ORDER BY

我认为在数据库级别我可以在主键和标题列上添加一个索引,以便不为 order by 子句生成临时索引;但是,Core Data 正在管理主键,我无法使用它添加多列索引,因为它不是对象级属性。

有没有办法使用索引或其他解决方案来加速这个查询?

4

0 回答 0