2014-01-06 2 views
0

Предполагая, что у меня есть схема, как это:Индексы с пользовательскими параметрами сортировки в SQLite

CREATE TABLE abc(
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    txt TEXT 
); 

CREATE INDEX "txtCS" ON "abc"("txt" COLLATE MY_CUSTOM_SORT); 

когда будет SQLITE использовать мой индекс на txt?

, потому что я побежал: (. Это не поиск, как я ожидал)

EXPLAIN QUERY PLAN SELECT * FROM abc ORDER BY txt COLLATE MY_CUSTOM_SORT DESC ... 

и он говорит мне, что он просматривает таблицу, дважды, используя txtCS индекс

MY_CUSTOM_SORT это мой собственную функцию сортировки, которую я подключил с помощью sqliteCreateCollation. Мне просто нужен этот индекс для некоторых запросов, которые связаны с специальным заказом, и я хочу, чтобы они были быстрыми.

+0

Я получаю одну запись 'SCAN TABLE abc ИСПОЛЬЗОВАНИЕ ПОКРЫТИЯ INDEX txtCS', что отлично. Что это за '...'? Какая версия SQLite? –

+0

Это то, что я тоже получаю. Но почему это SCAN, а не ПОИСК? – thelolcat

+0

Я предполагаю, что для использования пользовательского индекса SQL функция MY_CUSTOM_SORT должна быть явно объявлена ​​как SQLITE_DETERMINISTIC - см. Раздел [Indexes On Exions, Restrictions] (https://www.sqlite.org/expridx.html) для получения более подробной информации –

ответ

1

В ПОИСКе EXPLAIN QUERY PLAN output ПОИСК означает, что база данных пытается найти определенные записи (записи) с определенными значениями, тогда как SCAN означает, что база данных проходит через всю таблицу. Этот запрос возвращает все записи, поэтому наиболее эффективной операцией является SCAN.

Любая операция может быть увеличена с помощью индекса. (В SCAN база данных просто проходит через все записи индекса в порядке.)

Смежные вопросы