【问题标题】:Is it normal that sqlite.fetchall() is so slow?sqlite.fetchall() 这么慢是正常的吗?
【发布时间】:2012-04-26 15:24:09
【问题描述】:

我有一个从两个内部连接表中进行选择的 sql 查询。 select 语句的执行大约需要 50 秒。但是, fetchall() 需要 788 秒,并且只获取 981 个结果。这是查询和fetchall代码:

time0 = time.time()
self.cursor.execute("SELECT spectrum_id, feature_table_id "+
                    "FROM spectrum AS s "+
                    "INNER JOIN feature AS f "+
                    "ON f.msrun_msrun_id = s.msrun_msrun_id "+
                    "INNER JOIN (SELECT feature_feature_table_id, min(rt) AS rtMin, max(rt) AS rtMax, min(mz) AS mzMin, max(mz) as mzMax "+
                                 "FROM convexhull GROUP BY feature_feature_table_id) AS t "+
                    "ON t.feature_feature_table_id = f.feature_table_id "+
                    "WHERE s.msrun_msrun_id = ? "+
                    "AND s.scan_start_time >= t.rtMin "+
                    "AND s.scan_start_time <= t.rtMax "+
                    "AND base_peak_mz >= t.mzMin "+
                    "AND base_peak_mz <= t.mzMax", spectrumFeature_InputValues)
print 'query took:',time.time()-time0,'seconds'

time0 = time.time()
spectrumAndFeature_ids = self.cursor.fetchall()      
print time.time()-time0,'seconds since to fetchall'

fetchall 需要这么长时间有什么原因吗?


更新

在做:

while 1:
    info = self.cursor.fetchone()
    if info:
        <do something>
    else:
        break

一样慢
allInfo = self.cursor.fetchall()         
for info in allInfo:
    <do something>

【问题讨论】:

  • 我会尝试将尽可能多的严格等式约束移到INNER JOINON 子句中,因为这将(希望)最小化到达@987654326 的堆大小@ 部分(不等式通常会被加载到内存中以进行完整的堆扫描,此时您的时间尺度由堆大小而不是索引决定——这很烦人,可能不直观,但由于不等式查询的不确定性,这在很大程度上是不可避免的结果大小)。

标签: performance sqlite fetchall


【解决方案1】:

由于Cursor 对象的arraysize 设置为1,默认情况下fetchall() 与循环fetchone() 一样慢。

为了加快速度,您可以循环 fetchmany(),但要看到性能提升,您需要为其提供大于 1 的大小参数,否则它将通过批量 arraysize 获取“许多”,即 1.

您很可能只需提高arraysize 的值即可获得性能提升,但我没有这样做的经验,因此您可能想先通过以下方式进行试验:

>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> cu = conn.cursor()
>>> cu.arraysize
1
>>> cu.arraysize = 10
>>> cu.arraysize
10

更多关于上面的内容:http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.fetchmany

【讨论】:

  • 我接受了这个,因为它回答了我的问题,但我无法使用 fetchmany 来加速它。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多