小编典典

SQLite:ON DELETE CASCADE的性能不佳

sql

我在应用程序中使用SQLite数据库存储测量数据。

它是在项目中分组组织的。这些表与ON DELETE CASCADE用于处理链接的外键互连。该数据库如下所示:

  • 表项目
  • 表组(外键:project_id)
  • 表文件(外键:group_id)
  • 表数据点(外键:file_id)

所有外键引用列的声明如下

project_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT

外键这样声明

FOREIGN KEY(project_id) REFERENCES Projects(project_id) ON DELETE CASCADE

现在,我有1个项目,该项目中有1个组,该组中有800个文件,每个文件约有60个数据点。

删除群组的方法DELETE FROM Groups WHERE project_id=1效果很好,但大约需要21秒,对于我的需求而言,这太长了。

我已将删除内容包装在交易中。

我是SQL和SQLite的极端新手。这个持续时间是正常的还是有什么办法可以加快速度?我需要删除组以填写更新的值。在我的应用程序中,我只想在内存中保留一个项目,因此,仅删除整个数据库并从头开始填充它(虽然速度更快,大约需要1秒),实际上不是一个选择。

这些表是这样创建的:

'Create projects table
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Projects ( ProjectID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " & _
        "name TEXT NOT NULL, comment TEXT, date DATETIME2, diameter FLOAT(53), thickness FLOAT(53) );"

'Create Groups table
cmd.CommandText &= vbNewline & "CREATE TABLE IF NOT EXISTS Groups ( GroupID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, project_id INTEGER NOT NULL, " & _
        "name TEXT NOT NULL, text TEXT NOT NULL, fixed TINYINT NOT NULL, " & _
        "FOREIGN KEY(project_id) REFERENCES Projects(ProjectID) ON DELETE CASCADE );"

阅读 311

收藏
2021-05-23

共1个答案

小编典典

文档说:

子键列不需要索引,但是它们几乎总是有益的。

2021-05-23