【问题标题】:Sqlite database gives me warningsSqlite 数据库给了我警告
【发布时间】:2017-02-20 02:02:15
【问题描述】:

我有一个 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 的索引,我拥有的所有索引: -主键:id_player、id_bill、ordre_phase、类型 -类型 -id_player -ordre_phase -id_competition

我尝试使用 id_bill、ordre_phase 和 type 创建索引,但分析中的“使用自动覆盖索引”仍然相同。

我错过了什么吗?

【问题讨论】:

    标签: c# sqlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        相关资源
        最近更新 更多