我在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运行查询?
ADDITION
当我运行EXPLAIN QUERY PLAN
时,我得到以下内容
外壳:
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
或者实际上是问题本身是否存在差异。
答案 0 :(得分:1)
我想你想要每个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及其最新日期。 然后它将这个结果与表格中的类似选择结合起来,从中获取实际的最新日期,以便获得第二个最新日期。如果你需要的时间超过最近的两个日期,那将非常繁琐,但是对于两个日期,它应该没问题,而且可能要快得多。