Я создал схему 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
.
Один из них избыточен?Если так, как мне избавиться от одного из них и получить такое же поведение?