2014-09-29 38 views
0

我有这个命令创建一个表:的SQLite/FMDB性能问题时启用外键,对特定表

CREATE TABLE "A" (`id` INTEGER PRIMARY KEY NOT NULL, `b_id` INTEGER NOT NULL REFERENCES B(id) ON DELETE CASCADE, `c_id` INTEGER NOT NULL REFERENCES C(id) ON DELETE CASCADE, `field1` INTEGER, `field2` TEXT NOT NULL, `field3` INTEGER NOT NULL, `field4` INTEGER NOT NULL, `field5` INTEGER NOT NULL) 

当我使外国键的支持(通过PRAGMA命令),我有性能问题上此表在进行“大量”更新时(约3000)。我在其他表(其中也包含外键)上没有问题。对于这个表,更新在~90秒内完成,而其他表只需要〜1秒。如果我不启用外键,〜3k更新很快(几秒)完成。

附加说明:
- 我使用FMDatabase作为SQLite的包装。
- 我在事务中包装我的更新语句。
- 事务的执行时间似乎与事务中的更新数量成线性关系。例如,如果我只进行100次更新,则需要大约3秒钟的时间。
- 我试图将VACUUM数据库,我甚至试图从头开始重新创建它。它没有改变任何东西。

如果有人对此问题的来源有所了解,请告诉我!

+0

我的猜测是你错过了一个索引。 – 2014-09-29 16:25:09

回答

0

进行更新时,数据库需要查找并检查子记录。 因此,documentation建议

应该在每个外键约束的子键列上创建一个索引。

A.b_id上创建索引。

+0

感谢您的回答。在执行更新之前,我将以下脚本应用于数据库: CREATE INDEX AIndexB ON A(b_id); 但它没有效果。我也尝试创建两个索引(一个用于b_id和一个用于c_id,因为我有两个外键),但都没有任何改变。 – TreeTop 2014-09-29 15:56:03

+0

数据库中可能有其他外键。 – 2014-09-29 15:59:09