Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何提高使用外键的SQLite表的删除性能?_Python_Sqlite - Fatal编程技术网

Python 如何提高使用外键的SQLite表的删除性能?

Python 如何提高使用外键的SQLite表的删除性能?,python,sqlite,Python,Sqlite,从SQLite中启用外键的表中删除似乎非常慢。是否可以采取任何措施来提高性能(而不禁用外键) 导入时间 导入sqlite3 def fk_检查(状态): conn=sqlite3.connect(“:内存:”) c=连接光标() c、 执行(“创建表父级(id整数主键,名称)”) c、 执行(“创建表子项(id整数主键,父项\u id引用父项)”) c、 执行(“在子项上创建索引parentindex(父项id);”) c、 执行(f“pragma外键={state};”) 对于范围(10000

从SQLite中启用外键的表中删除似乎非常慢。是否可以采取任何措施来提高性能(而不禁用外键)

导入时间
导入sqlite3
def fk_检查(状态):
conn=sqlite3.connect(“:内存:”)
c=连接光标()
c、 执行(“创建表父级(id整数主键,名称)”)
c、 执行(“创建表子项(id整数主键,父项\u id引用父项)”)
c、 执行(“在子项上创建索引parentindex(父项id);”)
c、 执行(f“pragma外键={state};”)
对于范围(10000)内的i:
c、 执行(“插入父(名称)值(?);”,('name'+str(i),)
对于范围内的i(500010000):
c、 执行(“插入到子(父_id)值(?);”,(i,)
开始=时间。时间()
c、 执行(“从id<5000的父级删除”)
take=time.time()-start
打印(f'fk-{state}:{take}')
fk_检查(“打开”)
fk_检查(“关闭”)
fk_检查(“打开”)
fk_检查(“关闭”)
具有以下输出:

fk-on: 0.8750052452087402
fk-off: 0.0007216930389404297
fk-on: 0.8769822120666504
fk-off: 0.0007178783416748047
发件人:

每次应用程序从父表中删除一行时,都会执行与以下SELECT语句等效的操作,以搜索子表中的引用行:

SELECT rowid FROM <child-table> WHERE <child-key> = :parent_key_value
从其中选择rowid=:parent\u key\u value
如果此选择返回所有行,则SQLite认为从父表中删除该行将违反外键约束并返回错误。如果修改了父键的内容或在父表中插入了新行,则可能会运行类似的查询

启用FKs后,它会在每次删除时做额外的工作。我认为您无法在保留外键约束的同时避免这种情况