Python中的Sqlite3模块远比Shell更慢

时间:2014-05-06 11:25:35

标签: python sql shell sqlite

我在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或者实际上是问题本身是否存在差异。

1 个答案:

答案 0 :(得分:1)

对不起,我很抱歉,但我现在才发现这个问题 不幸的是,我不知道为什么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及其最新日期。 然后它将这个结果与表格中的类似选择结合起来,从中获取实际的最新日期,以便获得第二个最新日期。如果你需要的时间超过最近的两个日期,那将非常繁琐,但是对于两个日期,它应该没问题,而且可能要快得多。