Я хочу найти классику Наибольшая N на группу. У меня есть два способа решить эту проблемуНаибольшая N на группу в SQL Server
Dense_rank Over()
методуMin Over()
метод
Оба работают безупречно. Теперь я хочу найти, какой из них лучше и почему.
Образец данных:
CREATE TABLE #test
(
id INT,
NAME VARCHAR(50),
dates DATETIME
)
;WITH cte
AS (SELECT TOP (100000) n = ((Row_number()OVER (ORDER BY a.number) - 1)/3) + 1
FROM [master]..spt_values a
CROSS JOIN [master]..spt_values b)
INSERT INTO #test
SELECT n,
Getdate() + n
FROM cte
DENSE_RANK Over() Метод:
;WITH cte
AS (SELECT Dense_rank()OVER(partition BY NAME ORDER BY dates) AS rn,*
FROM #test)
SELECT id,
NAME,
dates
FROM cte
WHERE rn = 1;
Min Over() Метод:
WITH cte
AS (SELECT Min(dates)OVER(partition BY NAME) AS max_date,*
FROM #test)
SELECT id,
NAME,
dates
FROM cte
WHERE max_date = dates
Чтобы сравнить производительность, я проверил план выполнения, который сказал, что стоимость обоих запросов составляет 50%. Но план выполнения Max Over
выглядит немного сложным. Поэтому любое руководство здесь будет полезно. У меня нет хорошего понимания в плане исполнения.
Выполнение плана: (6 записей)
План выполнения: (100000 записей)
Для 100000
записывает план выполнения говорит
Dense_rank Over() Query cost : 46%
Min Over() Query cost : 54%
его опечатка обновлен до 'MIN Over'. Будет обновлен план выполнения после добавления 100 000 строк в таблицу –
Обновлен план выполнения для 100 000 записей. Я вижу некоторую разницу в стоимости запроса –