我在Python中使用sqlite3模块,但相对于在命令 shell 中在sqlite3中运行查询,发现它对某些SELECT查询而言非常慢。首先,我要说两个版本是相同的3.7.17。
我的查询是
SELECT r.ID, r.Date FROM my_table r
WHERE
r.Date IN (SELECT Date FROM my_table WHERE ID = r.ID GROUP BY Date LIMIT 2);
Python代码是
con = lite.connect(path_to_database)
cur = con.cursor()
with con:
cur.execute(sql_query)
其中
sql_query
是包含初始查询的字符串变量。我假设问题在于优化
IN
子查询。性能详细信息:
my_table
包含167000条记录,shell中的查询大约需要10秒钟,Python中的查询需要5分钟以上的时间(到目前为止,我将其停止了)。当前,因为它是表创建,所以我只是将代码复制并粘贴到 shell 中作为解决方法,如何解决此问题,以便可以从Python运行查询?
添加
当我运行
EXPLAIN QUERY PLAN
时,我得到以下信息shell :
0 0 0 SCAN TABLE PIT_10_Days AS r (~500000 rows)
0 0 0 EXECUTE CORRELATED LIST SUBQUERY 1
1 0 0 SEARCH TABLE PIT_10_Days USING AUTOMATIC C
1 0 0 USE TEMP B-TREE FOR GROUP BY
Python:
0 0 TABLE PIT_10_Days AS r
0 0 TABLE PIT_10_Days
我不确定这是否是在Python中获取
EXPLAIN QUERY PLAN
的问题,还是实际上是问题本身。 最佳答案
很抱歉这么晚,但是直到现在我才发现这个问题。
不幸的是,我不知道为什么sqlite3模块的行为与shell有所不同,但是
您可以尝试从一开始就避免相关查询。我不确定它是否总能满足您的要求,因为您没有在子查询中对结果进行排序。
我想您要每个ID的两个最新日期吗?
尝试这个:
SELECT r.ID AS ID, max( r.Date ) AS Date
FROM my_table AS r
GROUP BY r.ID
UNION
SELECT r.ID, max( r.Date )
FROM
my_table AS r
JOIN (
SELECT ID,
max( Date ) AS Date
FROM my_table
GROUP BY ID) AS maxDat
ON
r.ID = maxDat.ID AND
r.Date != maxDat.Date
GROUP BY r.ID;
它选择ID及其最新日期。
然后,通过从实际最晚日期取出的表中进行类似选择来统一此结果,以便获得第二个最新日期。如果您需要的时间比最近的两个日期多,那么这将非常麻烦,但是对于两个日期,这应该没问题,而且可能要快得多。
关于python - Python中的Sqlite3模块比Shell中的SELECT速度慢得多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23493393/