101 далматинец

Иногда, жизнь нам преподносит сюрпризы... Кто бы мог подумать, что в оптимизаторе заложена продемонстрированная ниже бомба :( Одно радует, что разработчики обещали в будущем это пофиксить... Если Вас заинтересовало, о чём тут идёт речь, обратите внимание на разницу во времени исполнения разных вариантов применения инструкции TOP и ROWCOUNT

-- SQL Server 2005 USE AdventureWorks GO PRINT '---------------------------- проба TOP 100 --------------------------------'; SET STATISTICS TIME ON; SELECT TOP 100 * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '---------------------------- ROWCOUNT 100 ---------------------------'; SET ROWCOUNT 100; SET STATISTICS TIME ON; SELECT * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber SET STATISTICS TIME OFF; GO SET ROWCOUNT 0; PRINT '---------------------------- TOP 101 --------------------------------'; SET STATISTICS TIME ON; SELECT TOP 101 * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '---------------------------- TOP 101 WITH TIES ----------------------'; SET STATISTICS TIME ON; SELECT TOP 101 WITH TIES * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '---------------------------- TOP 101 witl list all filds ------------'; SET STATISTICS TIME ON; SELECT TOP 101 [SalesOrderID] ,[SalesOrderDetailID] ,[CarrierTrackingNumber] ,[OrderQty] ,[ProductID] ,[SpecialOfferID] ,[UnitPrice] ,[UnitPriceDiscount] ,[LineTotal] ,[rowguid] ,[ModifiedDate] FROM [AdventureWorks].[Sales].[SalesOrderDetail] ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '----------------------------- TOP (@top=101) -----------------------'; DECLARE @top int; SET @top = 101; SET STATISTICS TIME ON; SELECT TOP (@top) * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '----------------------------- TOP (@top=101) WITH TIES -------------'; DECLARE @top int; SET @top = 101; SET STATISTICS TIME ON; SELECT TOP (@top) WITH TIES * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO PRINT '----------------------------- ROWCOUNT 101 -------------------------'; SET ROWCOUNT 101 SET STATISTICS TIME ON; SELECT * FROM Sales.SalesOrderDetail ORDER BY CarrierTrackingNumber; SET STATISTICS TIME OFF; GO -- На SQL Server 2000 этот порог равен TOP 1023

Получается, что если в условии исполнения запроса подразумевается сортировка по символьному, не индексированному полю, то для ограничения выборки превышающим 100 числом записей намного эффективнее использовать ROWCOUNT */

Published Fri, Aug 11 2006 16:43 by gladchenko
Filed under:

Comments

# re: 101 далматинец

Для SQL Server 2008 ситуация изменилась, разница между TOP 100 и TOP 101 уже не так заметна и ROWCOUNT даёт сравнимые по времени результаты.

Wednesday, February 04, 2009 4:02 AM by gladchenko

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: