Я разрабатываю запрос к таблице, которая содержит набор точек во временном ряду.Таблица может вырасти довольно большой, и поэтому я хочу, чтобы запрос эффективно уменьшал выходной результат путем усреднения точек за фиксированные временные интервалы.После написания запроса меня удивляет, как SQL Server (2008) решил выполнить запрос.План выполнения выявляет ненужную операцию сортировки, которая становится дорогой по мере роста временного ряда.Вот проблема, сведенная к простому примеру:
CREATE TABLE [dbo].[Example]
(
[x] FLOAT NOT NULL,
[y] FLOAT NOT NULL,
PRIMARY KEY CLUSTERED
(
[x] ASC
)
);
SELECT FLOOR([x]), AVG([y])
FROM [dbo].[Example]
GROUP BY FLOOR([x]);
Здесь у меня есть (x, y) пары, которые уже отсортированы по x (из-за кластеризованного первичного ключа), и я усредняю yдля каждого целого числа x (путем усечения с помощью функции FLOOR
).Я ожидаю, что таблица уже отсортирована по совокупности, поскольку FLOOR
является монотонной функцией.К сожалению, SQL Server решает, что эти данные необходимо пересортировать, и вот план выполнения:

Разве SQL Server не должен быть в состоянии выполнить потоковое агрегирование поданные, сгруппированные по монотонной функции столбцов, которые уже надлежащим образом отсортированы?
Существует ли общий способ переписать такие запросы, чтобы SQL Server увидел, что порядок сохранен?
[Обновление] Я нашел статью на эту тему Вещи, которые нужны SQL: проходимость монотонных функций и, как следует из названия, кажется, что это оптимизация, которую SQL Server еще не сделалdo (в большинстве случаев).
Вот еще более простые запросы по сравнению с [dbo].[Example]
, которые демонстрируют смысл:
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY FLOOR([x]) --sort performed in execution plan
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY 2*[x] --NO sort performed in execution plan
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY 2*[x]+1 --sort performed in execution plan
При любом сложении или умножении оптимизатор запросов понимает, что данныеуже имеет тот же порядок (и это видно, когда вы группируете по таким выражениям тоже).Таким образом, кажется, что концепция монотонных функций понятна оптимизатору, но обычно не применяется.
Сейчас я тестирую вычисляемое решение для столбцов и индексов, но похоже, что это значительно увеличит размерпостоянные данные, поскольку мне потребуется несколько индексов для охвата диапазона возможных интервалов.