【发布时间】:2012-03-23 16:32:50
【问题描述】:
我写了这个查询:
INSERT INTO KeysTable (KeyText, Id)
SELECT KeyText as BKT, KeysTable.ID as CID FROM KeysTable
INNER JOIN StatTable ON KeysTable.ID = StatTable.Key_ID
WHERE StatTable.StatCommandCode = 4 AND
EXISTS (SELECT 1 FROM StatTable WHERE StatCommandCode = 4 AND StatTable.Key_ID = CID);
我知道删除条件
AND StatTable.Key_ID = CID
会使查询非常快。另外,如果我将其替换为
AND StatTable.Key_ID = 444 // (444 - random static number)
查询也会非常快。此条件下的两列均已编入索引:
CREATE INDEX IF NOT EXISTS StatsIndex ON StatTable (Key_ID);
在 KeysTable 中,ID 列是主键。为什么在这种情况下索引没有提高性能?
感谢您的回答,抱歉我的英语不好:(。
【问题讨论】:
-
那个
EXISTS子查询有什么用? -
两个字段的类型是否相同(INT?CHAR?)?
-
那个 EXISTS 子查询似乎有点多余,因为你已经有了那个连接,不是吗?
-
StatTable.Key_ID 和 KeysTable.ID 具有相同的数据类型:[ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL //--- [Key_ID] integer NOT NULL
-
@Dmitriy:然后(仍然想知道这不会产生错误),您可以删除 EXISTS 子查询。您在 Join 中已经具备这些条件。
标签: sql performance sqlite indexing