作爲對我的問題的答案:Is it normal that sqlite.fetchall() is so slow?似乎fetch-all和fetch-one對於sqlite來說可能非常慢。運行sqlite查詢後,如何加速獲取結果?
正如我所提到,我有以下查詢:
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'
選擇語句的執行大約需要50秒(可接受的)。但是,fetchall()需要788秒,只能獲取981個結果。
提出加快查詢的方式,回答我的問題:Is it normal that sqlite.fetchall() is so slow?使用fetchmany(),並沒有提高獲取結果的速度。
運行sqlite查詢後,如何加速獲取結果?
正是我試圖執行它的命令行的SQL:
sqlite> 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 = 1
...> 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;
更新:
所以我就開始運行在命令行查詢約45分鐘前,它仍然很忙,所以使用命令行也很慢。
多少時間通過客戶端執行時,它不相同的查詢時間? – 2012-05-02 11:35:41
另外,你使用的是什麼sqlite3 python模塊?什麼版本?什麼是模塊使用的sqlite3版本? – 2012-05-02 11:44:12
我正在使用sqlite模塊:2.6.3和sqlite版本:3.7.10。我試圖通過SQLite管理器執行命令,但似乎無法應付它。 –