Индекс столбец суммы - PullRequest
       20

Индекс столбец суммы

20 голосов
/ 13 января 2009

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

Ответы [ 5 ]

41 голосов
/ 13 января 2009

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

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

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

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

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

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

SELECT sum(foo) FROM bar

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

9 голосов
/ 13 января 2009

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

5 голосов
/ 13 января 2009

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

На ваш конкретный вопрос «Является ли создание индекса для суммируемого столбца быстрее, чем отсутствие индекса?», Ответ - нет.

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

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

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

0 голосов
/ 20 мая 2009

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

ВЫБЕРИТЕ ПРОДУКТ, сумма (количество) ИЗ ЧЕКОВ, ГДЕ ПРОДУКТ = 1 ГРУППА ПО ПРОДУКТУ

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

0 голосов
/ 13 января 2009

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

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