Реферат: MS SQL 2005: оконные функции

SELECT *,

Row_Number() OVER (PARTITION BY ID_Customer

ORDER BY amount DESC) [rank]

FROM sample

)

SELECT * FROM Ranked

WHERE [rank] < 3

Такой запрос на этих данных примерно в 10 раз эффективнее, чем этот же запрос, выполненный в «старом стиле»:

SELECT *

FROM sample s1

WHERE ID_Trans in

(

SELECT top 2 ID_Trans

FROM sample s2

WHERE s1.ID_Customer = s2.ID_Customer

ORDER BY amount DESC

)

Более того, разница в скорости будет ощутимо расти с увеличением количества данных в таблице, поскольку в первом случае алгоритм довольно прост – внутренним запросом нумеруются записи внутри групп, практически за одну сортировку, а затем фильтром во внешнем запросе отсекаются все лишние записи. Во втором же случае, внутренний подзапрос выполняется заново, для каждой записи в таблице. Все это очень хорошо видно на планах запросов. На втором плане количество ожидаемых выполнений подзапроса – пятнадцать, так как в тестовой табличке 15 записей.

План запроса с аналитической функцией:

Операция Стоимость Количество

----------------------------------------------------------

|--Filter(WHERE:([Expr1003]<(3))) 0.022873 1

|--Sequence Project(...) 0.022866 1

|--Segment 0.022866 1

|--Segment 0.022866 1

|--Sort(ORDER BY:(...)) 0.022864 1

|--Clustered Index Scan(...) 0.006423 1

План запроса без использования аналитической функции:

Операция Стоимость Количество

К-во Просмотров: 288
Бесплатно скачать Реферат: MS SQL 2005: оконные функции