У меня есть избыточный индекс в этой схеме SQLite? - PullRequest
0 голосов
/ 08 февраля 2019

Я создал схему SQLlite следующим образом:

CREATE TABLE tab1 (
        year INTEGER,
        tar_id TEXT,
        content BLOB,
        UNIQUE (year, tar_id) ON CONFLICT REPLACE);
CREATE INDEX tab1_ix1 ON bcas (year, tar_id);

Затем я посмотрел на план запроса:

sqlite> explain query plan select * from tab1 where tar_id = 1 and year = (select max(year) from tab1 where year < 2019 and tar_id = 1);
QUERY PLAN
|--SEARCH TABLE tab1 USING COVERING INDEX sqlite_autoindex_tab1_1 (year=? AND tar_id=?)
`--SCALAR SUBQUERY
   `--SEARCH TABLE tab1 USING COVERING INDEX tab1_ix1 (year<?)

Мне кажется, что для этого достаточно только одного индексаэто, но он использует мой явный tab1_ix1 и автоматически сгенерированный sqlite_autoindex_tab1_1.

Один из них избыточен?Если так, как мне избавиться от одного из них и получить такое же поведение?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Хотя оба шва избыточны, но есть некоторые детали, на которые следует обратить внимание.В первой части запроса используется символ «*», поэтому лучше всего подходит автоматически созданный кандидат, поскольку он связывает все остальные столбцы для извлечения.В то время как во второй части с предложением «max» рассматриваются только два столбца (year, tar_id), и все они присутствуют с необходимой последовательностью в «меньшем» созданном вручную индексе «tab1_ix1», и механизм считает меньший эффективнее, поэтому на этот раз он использует tab1_ix1.

Таким образом, автоматически созданный индекс по умолчанию будет использоваться ядром, если возможное незначительное снижение производительности и вторая меньшая tab1_ix1 представляются разумными для обслуживания.

0 голосов
/ 08 февраля 2019

Да, у вас есть избыточный индекс.Ограничение unique создает индекс автоматически.Вам не нужно создавать еще один явно индекс для тех же столбцов в том же порядке.

Обратите внимание, что индекс на (tar_id, year) будет другим индексом, потому что порядок ключей в индексе имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...