Почему индекс SQLite не ускоряет запрос? - PullRequest
1 голос
/ 23 марта 2012

Я написал этот запрос:

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 является первичным ключом.Почему индекс не улучшает производительность в этом случае?

Спасибо за ответы и извините за мой плохой английский: (.

1 Ответ

4 голосов
/ 23 марта 2012

Если в одной из двух таблиц нет столбца 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)

...