Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/sqlite3:在执行数千个;选择";询问_Sql_Python 2.7_Optimization_Sqlite - Fatal编程技术网

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。这样一个指数会有很大的帮助。但是查询仍然必须访问数据页才能获得
剪切应变的值。答案中的索引是查询的“覆盖索引”,这意味着不需要访问原始数据页。