Я использовал SQL Server 2008 для этих трех вариантов Aquery. В моем тестировании я запрашиваю базу данных AdventureWorks, используя ProductInventory в схеме Production. Три запроса:
declare @max int
Select @max = MAX(Quantity) FROM [AdventureWorks].[Production].[ProductInventory]
SELECT TOP 1000 [ProductID]
,[LocationID]
,[Shelf]
,[Bin]
,[Quantity]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks].[Production].[ProductInventory]
WHERE Quantity = @max
SELECT TOP 1000 [ProductID]
,[LocationID]
,[Shelf]
,[Bin]
,[Quantity]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks].[Production].[ProductInventory]
WHERE Quantity = (Select MAX(Quantity) FROM [AdventureWorks].[Production].[ProductInventory])
SELECT TOP 1000 AW1.[ProductID]
,AW1.[LocationID]
,AW1.[Shelf]
,AW1.[Bin]
,AW1.[Quantity]
,AW1.[rowguid]
,AW1.[ModifiedDate]
FROM [AdventureWorks].[Production].[ProductInventory] AW1
LEFT JOIN [AdventureWorks].[Production].[ProductInventory] AW2 ON AW1.Quantity < AW2.Quantity
WHERE AW2.ProductID IS NULL;
Используя значок «Показать примерный план запроса», я могу сравнить события исключения для трех случаев. Результаты:
- Объявление переменной и ее заполнение выполняется на 5% быстрее, чем выбор в предложении where.
- Объединение на 98% медленнее, чем подвыбор
- Объединение на 99% медленнее, чем переменная
Я предлагаю объявить переменную и заполнить ее. Используйте переменную в предложении WHERE