私の質問に対する答えとして: sqlite.fetchall() がとても遅いのは普通ですか? sqlite では、fetch-all と fetch-one が非常に遅くなる可能性があるようです。
そこで述べたように、次のクエリがあります。
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'
select ステートメントの実行には約 50 秒かかります (許容範囲)。ただし、fetchall() には 788 秒かかり、981 件の結果しか取得できません。
私の質問への答えとして与えられたクエリを高速化するために提案された方法: sqlite.fetchall() がとても遅いのは普通ですか? 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 分前にコマンドラインでクエリの実行を開始しましたが、まだビジーであるため、コマンドラインを使用すると非常に遅くなります。