Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как определить что быстрее?  [new]
Hamber
Member

Откуда: Москва
Сообщений: 311
BEGIN TRAN

DECLARE @T TABLE (Num1 int, Num2 int)

INSERT INTO @T
	SELECT 1, 1
	 UNION ALL
	SELECT 1, 2
	 UNION ALL
	SELECT 2, 1
	 UNION ALL
	SELECT 3, 1
	 UNION ALL
	SELECT 4, 1

SELECT  *
FROM    @t

set statistics io on
set statistics time on


SELECT  TOP (1) with ties Num1, Num2
FROM    @T t
ORDER BY ROW_NUmber() OVER (partition by Num1 order by Num2 DESC)

;with cte as 
(
SELECT  *
		,rn = ROW_NUmber() OVER (partition by Num1 order by Num2 DESC)
FROM    @t
)
SELECT  cte.Num1, cte.Num2
FROM    cte 
WHERE	rn = 1

set statistics io off
set statistics time off

IF @@TranCount > 0
	ROLLBACK


Статистика выводит следующее:
автор
Table '#30FC736A'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(строк обработано: 1)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.

(строк обработано: 4)
Table '#30FC736A'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(строк обработано: 1)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.


Планы немного разные:
TIES:
|--Top(TOP EXPRESSION:((1)))
       |--Sort(ORDER BY:([Expr1003] ASC))
            |--Sequence Project(DEFINE:([Expr1003]=row_number))
                 |--Compute Scalar(DEFINE:([Expr1005]=(1)))
                      |--Segment
                           |--Sort(ORDER BY:([t].[Num1] ASC, [t].[Num2] DESC))
                                |--Table Scan(OBJECT:(@T AS [t]))


CTE:
|--Filter(WHERE:([Expr1004]=(1)))
       |--Sequence Project(DEFINE:([Expr1004]=row_number))
            |--Compute Scalar(DEFINE:([Expr1006]=(1)))
                 |--Segment
                      |--Sort(ORDER BY:([Num1] ASC, [Num2] DESC))
                           |--Table Scan(OBJECT:(@t))


Или может кто-то предложит более оптимизированный вариант? :)

Сообщение было отредактировано: 16 май 12, 14:42
16 май 12, 14:32    [12563405]     Ответить | Цитировать Сообщить модератору
 Re: Как определить что быстрее?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
на таком могучем объеме данных
SELECT 1, 1
	 UNION ALL
	SELECT 1, 2
	 UNION ALL
	SELECT 2, 1
	 UNION ALL
	SELECT 3, 1
	 UNION ALL
	SELECT 4, 1

реально все равно.
На более существенном у меня получалось,что СТЕ немного,но быстрее.
Если нужен пейджинг,то топ уже не катит..
Hamber
Или может кто-то предложит более оптимизированный вариант? :)

Для какой задачи?
16 май 12, 15:18    [12563706]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить