【发布时间】:2014-07-29 18:18:55
【问题描述】:
我对 SQLite 数据库(磁盘上 1.5GB)有一个简单的查询。看来我的循环很慢
for id, data in conn.execute("select ID, val in data order by ID"):
# do stuff
尽管 ID 列上有索引。 但是当我重新启动脚本时,之前运行中读取的行以可接受的速度循环。它们是否以某种方式被缓存?
我可以做些什么来快速循环完整的数据?
编辑:
显然 orderby/index 是问题所在。在有和没有 order by 的情况下循环遍历行之间有 2000 倍的速度差异。
Pragma table_info(data) 显示
ID: cid=0 type=int notnull=0 dflt_value=null pk=0
val: cid=1 type=int notnull=0 dflt_value=null pk=0
我没有对任何东西进行特殊调整。
VACUUM 没有提高性能。
我的索引是:
type=index, tbl_name=data rootpage=3 sql=create index myindex on data (ID)
已解决:创建一个覆盖索引 (id, val) 然后循环会快很多。其他调整都没有成功...
【问题讨论】:
-
您可以将表和索引的架构添加到您的问题中吗?它可能会帮助人们给出准确的答案。如果您不确定如何执行此操作,stackoverflow.com/questions/4654762/… 可能会有所帮助。
-
从本地磁盘复制一个 1.5GB 的文件到本地磁盘需要几分钟?如果您使用的不是软盘或一台太旧以至于无法在其上运行 Win7 的计算机,那么这似乎 非常 很慢。我刚刚在一台 2005 年的老式机器上复制了 5GB,花了 30 秒。
-
可能是因为文件在网络驱动器上。可以肯定的是,我现在正在本地驱动器上工作。无论如何,没有
order by的阅读速度是可以接受的。order by对未缓存数据的大规模减速太慢了。