вопрос о внутренних агрегатных функциях в SQL/Postgres

Как работает такая функция, как СУММ? Если я выполню

select id,sum(a) from mytable group by id

сортирует ли он по идентификатору, а затем суммирует по каждому диапазону одинаковых идентификаторов? Я не эксперт по планированию, но похоже, что это то, что происходит, где mytable может состоять из ста миллионов строк с несколькими миллионами различных идентификаторов.

Или он просто сохраняет хэш id -> current_sum, а затем в каждой строке либо увеличивает значение id, либо добавляет новый ключ? Разве это не намного быстрее и меньше памяти?


person sr1    schedule 23.03.2011    source источник
comment
Хорошо подумать, означает ли «быстрее» быстрее получить последнюю строку или первую строку набора результатов (или что-то еще).   -  person    schedule 24.03.2011


Ответы (2)


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

  1. Создайте рабочую таблицу из всех конструкторов таблиц в предложении FROM. (В вашем примере только один.)

  2. В предложении GROUP BY разбейте рабочую таблицу на группы. Сократите каждую группу до одной строки. Замените рабочий стол сгруппированным столом.

  3. Разрешите выражения в предложении SELECT.

Оптимизаторы запросов, которые следуют стандартам SQL, могут изменять порядок вещей по своему усмотрению, если результат будет таким же, как если бы они следовали этим шагам.

Вы можете найти более подробную информацию в ответах и ​​комментариях к это ТАК вопрос.

person Mike Sherrill 'Cat Recall'    schedule 23.03.2011

Итак, я нашел это, http://helmingstay.blogspot.com/2009/06/postgresql-poetry-aggregate-median-with.html, который утверждает, что действительно использует шаблон аккумулятора. Хм.

person sr1    schedule 23.03.2011