Performance sqlite.fetchall()如此缓慢是正常现象吗?
我有一个sql查询,它从两个内部联接表中进行选择。select语句的执行大约需要50秒。但是,fetchall需要788秒,它只获取981个结果。这是查询和获取所有代码:Performance sqlite.fetchall()如此缓慢是正常现象吗?,performance,sqlite,fetchall,Performance,Sqlite,Fetchall,我有一个sql查询,它从两个内部联接表中进行选择。select语句的执行大约需要50秒。但是,fetchall需要788秒,它只获取981个结果。这是查询和获取所有代码: time0 = time.time() self.cursor.execute("SELECT spectrum_id, feature_table_id "+ "FROM spectrum AS s "+ "INNER JOIN feature
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>
默认情况下,由于游标对象的arraysize设置为1,fetchall的速度与fetchone上的循环速度一样慢
为了加快速度,您可以在fetchmany上循环,但要看到性能提升,您需要为它提供一个大于1的size参数,否则它将逐批获取多个arraysize,即1
很有可能通过提高arraysize的值就可以获得性能增益,但我没有这样做的经验,因此您可能希望先通过执行以下操作来进行试验:
>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> cu = conn.cursor()
>>> cu.arraysize
1
>>> cu.arraysize = 10
>>> cu.arraysize
10
这里有更多关于上面的内容:默认情况下,由于游标对象的arraysize设置为1,fetchall与fetchone上的循环一样慢
为了加快速度,您可以在fetchmany上循环,但要看到性能提升,您需要为它提供一个大于1的size参数,否则它将逐批获取多个arraysize,即1
很有可能通过提高arraysize的值就可以获得性能增益,但我没有这样做的经验,因此您可能希望先通过执行以下操作来进行试验:
>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> cu = conn.cursor()
>>> cu.arraysize
1
>>> cu.arraysize = 10
>>> cu.arraysize
10
这里有更多关于上面的内容:我接受这个,因为它回答了我的问题,但我无法使用fetchmany使它加速。不过谢谢。我接受了这个,因为它回答了我的问题,但我无法让它加快使用fetchmany的速度。不过谢谢。我会尝试将尽可能多的严格等式约束移到内部联接的ON子句中,因为这样可以最大限度地减小到达不平等通常加载到内存中进行完整堆扫描的位置的堆的大小,此时,时间尺度由堆的大小决定,not index-这很烦人,可能不直观,但由于不等式查询结果大小的不确定性,这是不可避免的。我会尝试将尽可能多的严格等式约束移到内部JOIN的ON子句中,因为这将有望最大限度地减少堆的大小,因为不平等性通常会加载到内存中进行完整堆扫描,此时时间尺度由堆大小而不是索引决定-这很烦人,可能不直观,但由于查询结果大小的不确定性,这是不可避免的。