我有以下select语句(使用sqlite3和pysqlite模块):
self.cursor.execute("SELECT precursor_id FROM MSMS_precursor "+
"JOIN spectrum ON spectrum_id = spectrum_spectrum_id "+
"WHERE spectrum_id = spectrum_spectrum_id "+
"AND ROUND(ion_mz,9) = ? AND ROUND(scan_start_time,4) = ? "+
"AND msrun_msrun_id = ?", select_inputValues)
Run Code Online (Sandbox Code Playgroud)
在Python中运行时需要55秒.在SQLite命令行上直接运行它只需要15ms.现在,我注意到,当它在这一步中时,Python程序进入不间断的睡眠状态(31283 ndeklein 18 0 126m 24m 3192 D 1.0 0.0 2:02.50 python顶部输出中的D),并且它从100%CPU下降到大约1%的CPU.现在我在这个查询中注意到了,在运行我在这里询问的查询时,我也查看了顶部输出.在此期间,顶部还显示它进入不间断的睡眠,虽然它在R和D之间来回切换并且仅减慢到大约50%(它根据D或R状态是否波动).
所以现在我认为这正在减慢我的查询速度(如果不间断睡眠与程序速度无关,请纠正我).如果是这样,我怎样才能确保程序不进入这种状态?
使用Python返回的EXPLAIN QUERY PLAN:
(0, 0, 1, u'SCAN TABLE spectrum (~50000 rows)')
Run Code Online (Sandbox Code Playgroud)
使用sqlite的命令行返回EXPLAIN QUERY PLAN:
0|0|1|SCAN TABLE spectrum (~50000 rows)
0|1|0|SEARCH TABLE MSMS_precursor USING INDEX fk_MSMS_precursor_spectrum_spectrum_id_1 (spectrum_spectrum_id=?) (~2 rows) …Run Code Online (Sandbox Code Playgroud) 我有一个SQL查询,我检查一个值是否在表的最大值和最小值之间.我现在实现如下:
SELECT spectrum_id, feature_table_id
FROM 'spectrum', 'feature'
WHERE `spectrum`.msrun_msrun_id = 1
AND `feature`.msrun_msrun_id = 1
AND (SELECT min(rt) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= scan_start_time
AND scan_start_time <= (SELECT max(rt) FROM `convexhull` WHERE 'convexhull'.feature_feature_table_id = 'feature'.feature_table_id)
AND (SELECT min(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= base_peak_mz
AND base_peak_mz <= (SELECT max(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`feature_table_id)
Run Code Online (Sandbox Code Playgroud)
这运行得非常慢,因为每次运行此查询时我都会从convexhull中选择4次,所以我尝试使用内部连接来改进它:
SELECT spectrum_id, feature_table_id
FROM 'spectrum', 'feature'
INNER JOIN `convexhull` ON `convexhull`.feature_feature_table_id = `feature`.feature_table_id
WHERE `spectrum`.msrun_msrun_id = ? "+
AND `feature`.msrun_msrun_id …Run Code Online (Sandbox Code Playgroud)