2012-03-23 63 views
1

我寫此查詢:爲什麼SQLite索引不加快查詢?

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); 

KeysTableID列是主鍵。爲什麼指數在這種情況下不會提高性能? 。

謝謝你的回答和對不起我的英語不好:(

+1

添加索引有什麼用的是'EXISTS'子查詢的? – 2012-03-23 16:37:04

+0

均場同一類型(INT? CHAR?)? – Konerak 2012-03-23 16:39:20

+3

EXISTS子查詢看起來有點多餘,因爲你已經有了這個連接,不是嗎? – Konerak 2012-03-23 16:39:50

回答

4

如果在任何兩個表中沒有CID列,那麼EXISTS子查詢是沒有用的重寫語句:

INSERT INTO KeysTable (KeyText, Id) 
    SELECT KeyText 
     , KeysTable.ID 
    FROM KeysTable 
    INNER JOIN StatTable 
     ON KeysTable.ID = StatTable.Key_ID 
    WHERE StatTable.StatCommandCode = 4 

如果它仍然是緩慢的,你可以嘗試在(StatCommandCode, Key_ID)

+0

我仍然在試圖完成什麼。您正在'KeysTable'中插入一些數據,但這些數據已經存在了......表中有相同的行有什麼意義? – 2012-03-23 16:58:34

+0

謝謝!仍然想知道爲什麼我使用之前存在:)(也許之前,我有另一個子查詢 - 不知道)。存在是無用的,你是對的。 – Dmitriy 2012-03-23 16:59:31

+0

@Dmitriy:你能解釋一下Insert語句試圖做什麼嗎?它有什麼用處? – 2012-03-23 17:07:52

相關問題