Вряд ли заметно быстрее. Выигрыш от уменьшения размера внутренней временной таблицы (2 колонки вместо 5 на составном ключе) будет нивелироваться необходимостью делать соединение. Видимо, вы что-то с тестами "нахимичили" :) Кеш сбрасывали?
Я прогнал для полноты картины: 725 сек на 5 колонках и 709 на двух.
DECLARE @d datetime
SELECT @d = getdate()
SELECT @d
DBCC DROPCLEANBUFFERS;
WITH ordered_orders AS (
SELECT O.*,
row_number() OVER(
ORDER BY O.product_code ASC,
O.customer_code ASC,
O.order_type ASC,
O.qty_date ASC
) AS row_num
FROM orders O INNER JOIN customers C ON O.customer_code = C.customer_code
WHERE C.country_code = 'IT'
)
SELECT *
FROM ordered_orders
WHERE row_num BETWEEN 400001 AND 500000
GO
DECLARE @d datetime
SELECT getdate(), datediff(ss, @d, getdate())
SELECT @d = getdate()
SELECT @d
DBCC DROPCLEANBUFFERS;
WITH ordered_orders AS (
SELECT O.order_id,
row_number() OVER(
ORDER BY O.product_code ASC,
O.customer_code ASC,
O.order_type ASC,
O.qty_date ASC
) AS row_num
FROM orders O INNER JOIN customers C ON O.customer_code = C.customer_code
WHERE C.country_code = 'IT'
)
SELECT O.*, ordered.row_num
FROM ordered_orders ordered
join orders O on o.order_id = ordered.order_id
WHERE row_num BETWEEN 400001 AND 500000
SELECT getdate(), datediff(ss, @d, getdate())
Вряд ли заметно быстрее. Выигрыш от уменьшения размера внутренней временной таблицы (2 колонки вместо 5 на составном ключе) будет нивелироваться необходимостью делать соединение. Видимо, вы что-то с тестами "нахимичили" :) Кеш сбрасывали?
Я прогнал для полноты картины: 725 сек на 5 колонках и 709 на двух.