Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
sqlite3一起选择最小值和最大值要比单独选择它们慢得多_Sql_Sqlite_Sql Execution Plan - Fatal编程技术网

sqlite3一起选择最小值和最大值要比单独选择它们慢得多

sqlite3一起选择最小值和最大值要比单独选择它们慢得多,sql,sqlite,sql-execution-plan,Sql,Sqlite,Sql Execution Plan,当我分别使用min和max时,它工作得非常好。但是,由于某种原因,当我同时选择min和max时,sqlite将“忘记”索引。是否有任何配置我可以做(我已经使用了Analyze,它将不起作用)?或者对这种行为有什么解释 编辑1 这是sqlite查询优化器的一个已知怪癖,如下所述: 假设存在适当的索引,将优化以下形式的查询以在对数时间内运行: sqlite> .schema CREATE TABLE FixLog( app_id text, __k

当我分别使用
min
max
时,它工作得非常好。但是,由于某种原因,当我同时选择
min
max
时,sqlite将“忘记”索引。是否有任何配置我可以做(我已经使用了
Analyze
,它将不起作用)?或者对这种行为有什么解释

编辑1
这是sqlite查询优化器的一个已知怪癖,如下所述:

假设存在适当的索引,将优化以下形式的查询以在对数时间内运行:

sqlite> .schema 

CREATE TABLE FixLog(
                    app_id text,  __key__id INTEGER,
                    secret text, trace_code text, url text,
                    action text,facebook_id text,ip text,
                    tw_time datetime,time datetime,
                    tag text,to_url text,
                    from_url text,referer text,weight integer,
                    Unique(app_id, __key__id)
                    );
CREATE INDEX key4 on FixLog(action);
CREATE INDEX time on FixLog(time desc);
CREATE INDEX tw_time on FixLog(tw_time desc);



sqlite> explain query select min(time) from FixLog;
0|0|0|SEARCH TABLE FixLog USING COVERING INDEX time (~1 rows)
sqlite> explain query select max(time) from FixLog;
0|0|0|SEARCH TABLE FixLog USING COVERING INDEX time (~1 rows)
sqlite> explain query plan select max(time), min(time) from FixLog;
0|0|0|SCAN TABLE FixLog (~1000000 rows)
为了实现这些优化,它们必须完全按照上面所示的形式出现——只更改表和列的名称。不允许添加WHERE子句或对结果进行任何运算。结果集必须包含一列。“最小”或“最大”函数中的列必须是索引列

更新(2017/06/23):最近,这项更新表示,包含单个最大值或最小值的查询可能通过索引查找(允许算术等操作)得到满足;但是,它们仍然排除了在单个查询中有多个这样的聚合运算符(因此,MIN、MAX仍然很慢):

包含单个MIN()或MAX()聚合函数(其参数为索引最左边的列)的查询可以通过执行单个索引查找而不是扫描整个表来满足。示例:

 SELECT MIN(x) FROM table;
 SELECT MAX(x) FROM table;

你能添加你的索引定义吗?没有它就很难弄清楚发生了什么。我现在已经添加了索引信息。
 SELECT MIN(x) FROM table;
 SELECT MAX(x) FROM table;
SELECT MIN(x) FROM table;
SELECT MAX(x)+1 FROM table;