@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?
  • Вопрос задан
  • 4955 просмотров
Решения вопроса 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)
Насколько я понял из плана, взялась только часть индекса?

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

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект