Примечание: это предположение, основанное на моем понимании того, как работают планировщики SQL-запросов, и оно может быть не совсем точным.
Я считаю, что все агрегатные функции или, по крайней мере, "математические" функции, которые вы называете выше, должны быть O (n). Запрос будет выполнен примерно следующим образом:
- Выборка строк, соответствующих предикатам соединения и фильтрам (т. Е. "Предложение WHERE")
- Создание групп строк в соответствии с предложением GROUP BY. Одна группа строк создается для запросов без GROUP BY
- Для каждой группы строк примените статистическую функцию к строкам в группе. Для таких вещей, как SUM, AVG, MIN, MAX, а также для нечисловых функций, таких как CONCAT, существуют простые алгоритмы O (n), и я подозреваю, что они используются. Создайте одну строку в выходном наборе для каждой группы строк, созданной на шаге № 2
- Если присутствует предикат HAVING, отфильтруйте выходные строки, используя этот предикат
Обратите внимание, однако, что, хотя агрегатными функциями являются O (n), операция может не выполняться. Если вы создаете запрос, который декартово присоединяет таблицу к себе, вы будете искать минимум O (n * n) только для создания начального набора строк (шаг # 1). Сортировка для создания групп строк (шаг № 2) может быть O (n lg n) и может потребовать дискового пространства для операции сортировки (в отличие только от операции в памяти), поэтому ваш запрос может все еще работать плохо, если вы манипулируя многими рядами.