Вопрос

Создает ли индекс для суммируемого столбца быстрее, чем без индекса?

Это было полезно?

Решение

Извините, не понятно, о чем вы спрашиваете.

Вы спрашиваете, ускорит ли такой запрос, как

SELECT product, sum(quantity) FROM receipts 
GROUP BY product

если вы добавили индекс по количеству?

Если это вопрос, то ответ - нет. Вообще говоря, индексы полезны, когда вам нужно найти всего несколько строк среди множества; здесь вам нужны все строки, поэтому индекс не помогает.

Существует неясное исключение (которое применяется так редко, что большинство оптимизаторов БД, вероятно, не удосуживаются реализовать этот трюк). Если ваш запрос оказался

SELECT sum(foo) FROM bar

, где есть индекс для foo, а bar - это таблица со многими столбцами, можно прочитать полный индекс, что приведет к меньшему удару, чем если вы прочитаете базовую таблицу, и получите ответ непосредственно из индекс - никогда не трогать «реальный» стол вообще! Однако это довольно редкий случай, и вы захотите проверить, знает ли ваш оптимизатор об этом, прежде чем слишком полагаться на него.

Другие советы

Нет.Индексы улучшают поиск, ограничивая количество необходимых проверок.Агрегатная функция (count, max, min, sum, avg) должна проходить через все записи в столбце независимо от этого.

Если вы хотите ускорить суммирование, вы можете предварительно материализовать результат. В Oracle используйте Материализованные представления , в MS SQL используйте Индексированные представления .

По вашему конкретному вопросу " Создание индекса для столбца, который суммируется, быстрее, чем отсутствие индекса? " ;, ответ: Нет.

Ответ на ваш вопрос лежит на ответе Спенсера:

" Агрегатная функция (count, max, min, sum, avg) должна проходить через все записи в столбцах, которые суммируются независимо. "

Просто уточнил контекст столбцов в ответе Спенсера. Его ответ, тем не менее, правильный.

Если индекс покрывает, это обычно будет быстрее. Насколько быстрее будет определяться разница между количеством столбцов в таблице и числом в индексе. Кроме того, это может быть быстрее, если есть какие-либо критерии фильтрации.

Я нашел, что индексирование столбца в where (productid здесь) помогает при использовании этого запроса:

ВЫБЕРИТЕ productid, сумма (количество) ИЗ ЧЕСТЕЙ, ГДЕ productid = 1 GROUP BY productid

Один из моих запросов прошел от 45 секунд до почти мгновенного после добавления индекса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top