Jen*_*ens 3 sql database sqlite foreign-keys
我在我的应用程序中使用SQLite数据库来存储测量数据.
它在项目中分组.这些表与外键互连,ON DELETE CASCADE
用于处理链接.数据库看起来像这样:
所有外键引用的列都声明为
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秒,这对我的需求来说太长了.
我已将删除包装在一个Transaction中.
我是SQL和SQLite的极端新手.这个持续时间是正常的还是有办法加快速度?我需要删除该组以填写更新的值.在我的应用程序中,我只想将一个项目保留在内存中,所以只需删除整个数据库并从头开始填充它(虽然快得多,~1 sek)并不是一个真正的选择.
这些表是这样创建的:
'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 );"
Run Code Online (Sandbox Code Playgroud)
该文件说:
子键列不需要索引,但它们几乎总是有益的.[...]
每次应用程序从...父表中删除一行时,它都会执行[查询]以搜索...子表中的引用行.
如果此查询返回任何行,则SQLite断定从父表中删除行将违反外键约束并返回错误.如果修改了父键的内容或者将新行插入到父表中,则可以运行类似的查询.如果这些查询无法使用索引,则会强制它们对整个子表执行线性扫描.在非平凡的数据库中,这可能非常昂贵.
因此,在大多数实际系统中,应在每个外键约束的子键列上创建索引.子键索引不必是(通常也不是)UNIQUE索引.
因此,您应该在子键列上创建索引:
CREATE INDEX Groups_project_id_index ON Groups(project_id);
Run Code Online (Sandbox Code Playgroud)