Можно ли использовать индексы для агрегированных расчетов? - PullRequest
0 голосов
/ 29 сентября 2019

Индекс может использоваться для выполнения чего-то подобного:

SELECT name FROM bigtable GROUP BY name

То есть он может проходить через btree или любую структуру индекса, чтобы получить значения.Однако помогает ли индекс как-то так?

SELECT name, count(1) FROM bigtable GROUP BY name

Обратите внимание, что для целей этого вопроса не будет применен фильтр или сортировка.

Я так думаюне потому, что для «суммирования» всех значений потребуется сканирование таблицы (независимо от наличия индекса).Это правильно, или я что-то здесь упускаю?Являются ли индексы когда-либо полезными для агрегированных вычислений?Как или как нет?

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

1 Ответ

2 голосов
/ 29 сентября 2019

Я думал, что это не так, потому что потребуется сканирование таблицы (независимо от того, есть ли индекс), чтобы «суммировать» все значения.

Нет, вы также можете просто отсканировать индекс.Он содержит (в вашем примере) запись для каждой строки и значение name столбца.

И, в отличие от таблицы, индекс уже будет сгруппирован / отсортирован по name, поэтому дополнительный этап сортировки не требуется.Если вы попытаетесь сделать это с полным сканированием таблицы, вам понадобится много памяти или временное пространство для запуска счетчиков для каждого имени.

Именно эта вторая часть и делает здесь большую разницу (не так много, что сканирование всего индекса происходит быстрее, чем сканирование всей таблицы, что также верно, конечно, потому что он меньше и, возможно, уже кэширован).

Вы можете легко проверить это, посмотрев наплан выполнения.

Обратите внимание, что для целей этого вопроса не будет применяться фильтр или сортировка.

Если вы ссылались на другие столбцы в запросеиндекс больше не является «индексом покрытия» и больше не может использоваться (сам по себе) для удовлетворения запроса.

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