相关疑难解决方法(0)

不间断的睡眠导致我的Python程序真的很慢(如果是这样,我该如何解决这个问题?)?

我有以下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状态是否波动).

所以现在我认为这正在减慢我的查询速度(如果不间断睡眠与程序速度无关,请纠正我).如果是这样,我怎样才能确保程序不进入这种状态?


更新1:

使用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)

python linux sqlite performance sleep

16
推荐指数
1
解决办法
1296
查看次数

如何以有效的方式使用min()和max()?

我有一个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)

sql sqlite performance max min

1
推荐指数
1
解决办法
1067
查看次数

标签 统计

performance ×2

sqlite ×2

linux ×1

max ×1

min ×1

python ×1

sleep ×1

sql ×1