在特定表上启用外键时SQLite / FMDB性能问题

时间:2014-09-29 15:16:12

标签: ios performance 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数据库,我甚至尝试从头开始重新创建它。它没有改变任何东西。

如果有人对这个问题的根源有所了解,请告诉我们!

1 个答案:

答案 0 :(得分:0)

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

  

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

A.b_id上创建索引。