Python/sqlite3:在执行数千个;选择";询问
下面是一个简单的用例:Python/sqlite3:在执行数千个;选择";询问,sql,python-2.7,optimization,sqlite,Sql,Python 2.7,Optimization,Sqlite,下面是一个简单的用例: selectString = "SELECT MAX(shear_strain) FROM detailed_structure_info WHERE elementGroup = ? AND element = ? AND analysis = ?" selectInputTuple = list(itertools.product(elementGroups, elementNumbers, analysisNumbers)) results = [] numExe
selectString = "SELECT MAX(shear_strain) FROM detailed_structure_info WHERE elementGroup = ? AND element = ? AND analysis = ?"
selectInputTuple = list(itertools.product(elementGroups, elementNumbers, analysisNumbers))
results = []
numExecutes = 0
for selectInputTuple in selectInputTuples:
c = ei_cursor.execute(selectString, selectInputTuple)
results.append(c.fetchone()[0])
numExecutes += 1
print "{} out of {} commands completed...".format(numExecutes, len(selectInputTuples))
现在,每次循环大约需要1秒,可能需要循环数百次。我曾考虑过如何执行尽可能大的SELECT语句,但目前,我认为这是我能做到的最小的一个语句,因为在继续之前,我绝对需要聚合一个特定的列。那么,我还可以如何编写SELECT语句来优化速度呢?通过元组循环来进行聚合似乎是浪费。只需使用
分组方式
,即可立即获得所有结果:
SELECT elementGroup, element, analysis, MAX(shear_strain) as max_shear_strain
FROM detailed_structure_info
GROUP BY elementGroup, element, analysis;
如果出于某种原因必须运行单独的查询,请创建索引:
create index idx_detailed_structure_info_4
on detailed_structure_info(elementGroup, element, analysis, shear_strain);
谢谢你的回复!但我不确定我是否理解第二点……”“如果出于某种原因必须运行单独的查询,那么请创建一个索引……”。你能解释一下吗?索引将加速你现在在循环中运行的查询。第一种方法执行单个查询,以消除对循环的需要。你的第一个建议很有魅力…从300秒下降到10秒!哇,啊,你的意思是,如果我以后不得不运行一个单独的查询,需要来自同一列的内容?这样,我已经在某种意义上“预先组织”了数据?@unutbu。这样一个指数会有很大的帮助。但是查询仍然必须访问数据页才能获得
剪切应变的值。答案中的索引是查询的“覆盖索引”,这意味着不需要访问原始数据页。