Оптимизировать получение количества строк, сгруппированных по первой букве в SQLite? - PullRequest
1 голос
/ 26 августа 2010

Мой текущий запрос выглядит примерно так:

SELECT SUBSTR(name,1,1), COUNT(*) FROM files GROUP BY SUBSTR(name,1,1)

Но это занимает довольно много времени, чтобы просто выполнить подсчет таблицы, которая уже проиндексирована столбцом name.Из этого вопроса я увидел, что некоторые движки могут неправильно использовать индексы для функции SUBSTR, и на самом деле sqlite не будет использовать индексы для SUBSTR (строка, 1,1) .

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

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Одной из стратегий, которая соответствует вашему шаблону доступа, является добавление нового индексированного столбца «first_letter» в вашу таблицу. Используйте триггер для установки значения при вставке и обновлении. Тогда ваш запрос представляет собой простую группу по first_letter.

0 голосов
/ 27 августа 2010

Другая стратегия заключается в создании теневой таблицы, которая содержит агрегацию материнской таблицы.Это не легко, потому что ваша работа как разработчика - поддерживать теневую таблицу в соответствии с материнской таблицей.Каждое удаление, обновление или вставка в таблицу файлов должно сопровождаться изменением в теневой таблице.

Базы данных, такие как Oracle, поддерживают материализованные представления для достижения этого автоматически, а sqlite - нет.

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