Python sqlite3从不返回具有2800万行以上的内部联接

毛虫

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帖子,希望我遵循适当的礼节。

CL。

Python倾向于具有旧版本的SQLite库,尤其是Python 2.x,该版本未更新。

但是,您的实际问题是查询速度很慢。使用常规机制对其进行优化,例如在INC_FULLPATH上创建一个两列索引INC_MODIFIED_TIME

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

的Python:sqlite3

来自分类Dev

使用Python3 / sqlite3创建具有未知列数的表

来自分类Dev

Python SQLite3插入不返回错误,但表中没有数据

来自分类Dev

使用 Flask-SQLAlchamy 和 Python3 将数百万行插入到 SQLite3 表中

来自分类Dev

Python SQLite3插入

来自分类Dev

SQLite3 Python变量

来自分类Dev

Python SQLite3插入

来自分类Dev

Sqlite3与python插入同一行

来自分类Dev

带有参数的Python SQlite3插入

来自分类Dev

带有冒号查找的Python SQLite3 Mac地址

来自分类Dev

Python 的 sqlite3 不会获取所有结果

来自分类Dev

Python SQLite3:想要迭代地获取行,但是代码拉动其他所有行

来自分类Dev

对具有100万行的表进行查询优化

来自分类Dev

查询具有5000万行的大表

来自分类Dev

处理python中的大量输入(10万行)的最佳方法是什么?

来自分类Dev

使用Python / MySQL插入约2000万行的最佳方法

来自分类Dev

内部服务器错误:Python Flask渲染模板sqlite3

来自分类Dev

使用`executemany`更新现有SQLite3数据库中的条目(使用Python sqlite3)

来自分类Dev

SQLite3 python按月提取数据

来自分类Dev

python中的sqlite3索引表

来自分类Dev

使用sqlite3编译Python 3.4

来自分类Dev

python程序中的sqlite3函数

来自分类Dev

在Python中将Null插入SQLite3

来自分类Dev

插入字典sqlite3(python)

来自分类Dev

Python中的SQLite3 WHERE子句

来自分类Dev

Python,sqlite3和UPDATE多行

来自分类Dev

Python SQLite3无法正常工作

来自分类Dev

Python SQLite3 If字段==变量

来自分类Dev

使用python的SQLite3中的查询