@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap

SQLite не использует индекс по дате

Есть простенькая табличка:
CREATE TABLE "cashes" (
    "id" INTEGER PRIMARY KEY  NOT NULL,
    "date" DATE NOT NULL,
    "uid" INT(10) NOT NULL DEFAULT ('1'),
    "visible" TINYINT(4) NOT NULL DEFAULT ('1')
)

И пара индексов по ней:
CREATE INDEX "XIF_CASHES_USR" on cashes (uid ASC);
CREATE INDEX "XIF_CASHES_DUV" on cashes (date DESC, uid ASC, visible ASC);


Строгий запрос по определенной дате использует нужный индекс по 3 полям:
EXPLAIN QUERY PLAN SELECT
      c.id, c.uid, c.date
     FROM cashes c
     WHERE
      c.date = '2013-04-01'
      AND c.uid = 1 AND c.visible = 1
     ORDER BY
      c.date

План:
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_DUV (date=?) (~2 rows)

А вот запрос с benween уже нет:
EXPLAIN QUERY PLAN SELECT
      c.id, c.uid, c.date
     FROM cashes c
     WHERE
      c.date BETWEEN '2013-04-01' AND '2013-06-01'
      AND c.uid = 1 AND c.visible = 1
     ORDER BY
      c.date

Судя по плану уже подхватывается не тот индекс:
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_USR (uid=?) (~2 rows)

Собственно, как заставить SQLite 3 использовать индекс по дате в запросах с BETWEEN?
  • Вопрос задан
  • 4959 просмотров
Решения вопроса 1
@mayorovp
А почему вы не сделаете индекс (uid, visible, date)?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Akuma
@Akuma
Веб-программист
Попробуйте
WHERE c.`date` > '2013-04-01' AND c.`date` <  '2013-06-01'

Либо FORCE INDEX. Только не знаю есть ли он в SQLite
Ответ написан
@pihel Автор вопроса
Sql, Oracle, pl/sql, BI, ETL, php, olap
Больше/меньше не меняют план.
А вот хинт, да, помогает.
Но хотелось бы без него…
EXPLAIN QUERY PLAN SELECT
      c.id, c.uid, c.date
     FROM cashes c INDEXED BY XIF_CASHES_DUV
     WHERE
      c.date >= '2013-04-01' AND c.date <= '2013-06-01'
      AND c.uid = 1 AND c.visible = 1
     ORDER BY
      c.date

План:
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_DUV (date>? AND date<?) (~600 rows)
Насколько я понял из плана, взялась только часть индекса?

Все же хотелось бы стандартный подход без использования хинтов…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы