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;