вопрос о внутренних функциях агрегатных функций в SQL / Postgres - PullRequest
2 голосов
/ 24 марта 2011

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

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

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

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

Ответы [ 2 ]

1 голос
/ 24 марта 2011

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

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

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

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

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

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

0 голосов
/ 24 марта 2011

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

...