Sqlite数据库有两个表,每个表长超过2800万行。这是模式:
CREATE TABLE MASTER (ID INTEGER PRIMARY KEY AUTOINCREMENT,PATH TEXT,FILE TEXT,FULLPATH TEXT,MODIFIED_TIME FLOAT);
CREATE TABLE INCREMENTAL (INC_ID INTEGER PRIMARY KEY AUTOINCREMENT,INC_PATH TEXT,INC_FILE TEXT,INC_FULLPATH TEXT,INC_MODIFIED_TIME FLOAT);
这是MASTER的示例行:
ID PATH FILE FULLPATH MODIFIED_TIME
---------- --------------- ---------- ----------------------- -------------
1 e:\ae/BONDS/0/0 100.bin e:\ae/BONDS/0/0/100.bin 1213903192.5
这些表的数据基本相同,但MASTER中的MODIFIED_TIME和INCREMENTAL中的INC_MODIFIED_TIME之间存在一些差异。
如果我在sqlite中执行以下查询,则会得到预期的结果:
select ID from MASTER inner join INCREMENTAL on FULLPATH = INC_FULLPATH and MODIFIED_TIME != INC_MODIFIED_TIME;
该查询将暂停一分钟左右,返回一些行,再次暂停,返回更多行,依此类推,然后完成而不会出现问题。大约需要2分钟才能完全归还所有内容。
但是,如果我在Python中执行相同的查询:
changed_files = conn.execute("select ID from MASTER inner join INCREMENTAL on FULLPATH = INC_FULLPATH and MODIFIED_TIME != INC_MODIFIED_TIME;")
它永远不会返回-我可以让它运行24小时,却什么也没有。python32.exe进程不会开始消耗大量的cpu或内存-它保持静态。而且,该进程本身实际上似乎并没有反应迟钝-但是,我无法Ctrl-C中断,而不得不终止该进程才能真正停止脚本。
我在小型测试数据库中没有这些问题-一切都在Python中运行良好。
我意识到这是大量数据,但是如果sqlite正在处理实际的查询,则python不应对此感到窒息,应该吗?我可以从python对这个数据库进行其他大型查询。例如,这有效:
new_files = conn.execute("SELECT DISTINCT INC_FULLPATH, INC_PATH, INC_FILE from INCREMENTAL where INC_FULLPATH not in (SELECT DISTINCT FULLPATH from MASTER);")
有任何想法吗?sqlite返回数据之间的停顿是否会导致Python问题?还是从不发生任何事情来表明查询结果已结束(如果是,为什么它在小型数据库中起作用)?
谢谢。这是我的第一个stackoverflow帖子,希望我遵循适当的礼节。
Python倾向于具有旧版本的SQLite库,尤其是Python 2.x,该版本未更新。
但是,您的实际问题是查询速度很慢。使用常规机制对其进行优化,例如在INC_FULLPATH
和上创建一个两列索引INC_MODIFIED_TIME
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句