Я нашел этот пост об ускорении отдельных запросов:
Сверхбыстрый DISTINCT с использованием рекурсивного CTE:
USE tempdb;
GO
DROP TABLE dbo.Test;
GO
CREATE TABLE
dbo.Test
(
data INTEGER NOT NULL,
);
GO
CREATE CLUSTERED INDEX c ON dbo.Test (data);
GO
-- Lots of duplicated values
INSERT dbo.Test WITH (TABLOCK)
(data)
SELECT TOP (5000000)
ROW_NUMBER() OVER (ORDER BY (SELECT 0)) / 117329
FROM master.sys.columns C1,
master.sys.columns C2,
master.sys.columns C3;
GO
SET STATISTICS TIME ON;
-- 1591ms CPU
SELECT DISTINCT
data
FROM dbo.Test;
- 15 мс ЦП
WITH RecursiveCTE
AS (
SELECT data = MIN(T.data)
FROM dbo.Test T
UNION ALL
SELECT R.data
FROM (
-- A cunning way to use TOP in the recursive part of a CTE Smile
SELECT T.data,
rn = ROW_NUMBER() OVER (ORDER BY T.data)
FROM dbo.Test T
JOIN RecursiveCTE R
ON R.data < T.data
) R
WHERE R.rn = 1
)
SELECT *
FROM RecursiveCTE
OPTION (MAXRECURSION 0);
SET STATISTICS TIME OFF;
GO
DROP TABLE dbo.Test;
Рекурсивный CTE в 100 раз эффективнее :-) Этот тип ускорения был бы чрезвычайно полезен для моего текущего проекта, но я не уверен, в каких случаях этот подход выгоден.
Если честно: я не понимаю, почему это так сильно ускоряет запрос и почему база данных не может выполнить эту оптимизацию сама. Можете ли вы объяснить, как это работает и почему это так эффективно?
Редактировать: я вижу аналогичный эффект на sybase, поэтому этот подход не подходит только для sql-сервера.
Подвопрос: полезна ли рекурсивная CTE для других систем баз данных?