Sqlite数据库给我警告

时间:2016-10-11 13:46:23

标签: c# sqlite

我有一个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创建索引但仍然相同"使用自动覆盖索引"在分析中。

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

数据库在子查询id_bill的列d2上创建临时索引。

除非您为此子查询显式创建(临时)表,否则无法显式创建此索引。

忽略警告。 如果您需要优化此查询,请考虑重写它,以便不必与这样复杂的子查询进行连接,即可以subquery flattening

答案 1 :(得分:0)

通过@CL扩展答案的范围,公用表表达式(SQLite WITH clause)可能还会创建一个临时索引,警告显示为cteName(tempColumnName)