Прежде всего, это две разные модели данных, подходящие для разных целей.
Это, как говорится, я бы ожидать, вторая модель будет быстрее для агрегации, просто потому, что данные упакованы более компактно, поэтому необходимости меньше I/O:
- The GROUP BY в первая модель может быть удовлетворена полностью сканирование по индексу
{size, price}
. Альтернатива индексу слишком медленная, когда данные слишком велики для размещения в ОЗУ.
- Запрос во второй модели может быть удовлетворен полным сканированием таблицы. Не требуется указаний .
Поскольку для первого подхода требуется таблица + индекс, а вторая - только таблица, использование кэша лучше во втором случае.Даже если мы проигнорируем кеширование и сравниваем индекс (без таблицы) в первой модели со следующей во второй модели, я подозреваю, что индекс будет больше, чем таблица, просто потому, что он физически записывает size
и имеет неиспользуемые «дыры» типичные для B-деревьев (хотя то же самое верно для таблицы, если оно равно clustered).
И, наконец, вторая модель не имеет служебных расходов на обслуживание индекса, что может повлиять на производительность INSERT/UPDATE/DELETE.
Кроме этого, вы можете рассматривать кеширование SUM и COUNT в отдельной таблице, содержащей только одну строку. Обновляйте триггеры SUM и COUNT через триггеры, когда строка вставлена, обновлена или удалена в основной таблице. Затем вы можете легко получить текущий AVG, просто разделив SUM и COUNT.
Но вы должны действительно мера репрезентативных объемов данных, чтобы быть уверенным.
Поскольку нет ИНЕКЕ в запросе, все строки будут проверяться. Индексы полезны только для получения относительно небольшого подмножества строк таблицы (а иногда и для index-only scans). Как правило, если требуется более 10% строк в таблице, индексы не помогут, и СУБД часто выбирают полное сканирование таблицы, даже если индексы доступны.
Большое спасибо за отличное объяснение! Ваши дополнительные комментарии в конце очень полезны, мой вопрос - это просто краткое изложение более крупной проблемы, с которой я столкнулся, и я обязательно их рассмотрю внимательно. – sashkello