我有一个sqlite数据库,我在C#项目中使用System.Data.SQLite。
我的要求是:
SELECT d1.* FROM DYN_table as d1 INNER JOIN ( SELECT id_bill, ordre_phase, type, MAX(valeur) maximum FROM DYN_table WHERE id_customer=347 AND type IN (1,5,2) GROUP BY id_bill, ordre_phase, type) as d2 ON d1.type = d2.type AND d1.valeur = d2.maximum AND d1.ordre_phase=d2.ordre_phase AND d1.id_bill=d2.id_bill WHERE d1.id_customer=347 AND d1.type IN (1,5,2)
请求正在运行,但我有以下警告:
SQLite warning (284): automatic index on sqlite_sq_1E5A8EC0(id_bill)
当我尝试使用" EXPLAIN QUERY PLAN"我看到最后一步是:
SEARCH SUBQUERY 1 AS d2 USING AUTOMATIC COVERING INDEX (id_bill=? AND ordre_phase=? AND type=?)
但是这个表中有一个id_bill的索引,我拥有的所有索引: -Primary Key:id_player,id_bill,ordre_phase,type -类型 -id_player -ordre_phase -id_competition
我尝试使用id_bill,ordre_phase和type创建索引但仍然相同"使用自动覆盖索引"在分析中。
我错过了什么吗?
答案 0 :(得分:3)
数据库在子查询id_bill
的列d2
上创建临时索引。
除非您为此子查询显式创建(临时)表,否则无法显式创建此索引。
忽略警告。 如果您需要优化此查询,请考虑重写它,以便不必与这样复杂的子查询进行连接,即可以subquery flattening。
答案 1 :(得分:0)
通过@CL扩展答案的范围,公用表表达式(SQLite WITH clause)可能还会创建一个临时索引,警告显示为cteName(tempColumnName)