Это зависит. Какие индексы на столе? Какой объем строк в таблице?
Я только что создал пример, который показал хорошие результаты, но он может сильно отличаться от вашего сценария. Как правило, если у оптимизатора возникают проблемы, запрос необходимо упростить. То, что вы сделали, может быть, то, что требуется. Это зависит. Вот SQL-код, который я выбрал, чтобы узнать, смогу ли я найти что-нибудь очевидное при включенном плане выполнения show.
установить nocount на
GO
если object_id ('tempdb .. # MaxMinExample') не является пустой таблицей перетаскивания # MaxMinExample
GO
создать таблицу #MaxMinExample ([ключ] int identity (1,1) кластеризованный первичный ключ, iField1 int, iField2 int, dtDate datetime, iSomeField1 int, iSomeField2 int, iSomeField3 int, iSomeField4 int)
GO
- исходный набор данных, который мы будем декартовым
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
значения (1,2, getdate (), 1,2,3,4)
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
значения (2,3, getdate () + 1,4,5,6,7)
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
значения (3,4, getdate () + 2,5,6,7,8)
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
значения (5,6, getdate () + 3,6,7,8,9)
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
значения (6,7, getdate () + 4,7,8,9,10)
GO
- создать загрузку данных
объявить @count int set @ count = 1
while (выберите количество (*) из #MaxMinExample) <865830
начать
вставить в #MaxMinExample (iField1, iField2, dtDate, iSomeField1, iSomeField2, iSomeField3, iSomeField4)
выберите a.iField1+@count, a.iField2 + @ count, a.dtDate + @ count, a.iSomeField1 + @ count, a.iSomeField2 + @ count, a.iSomeField3 + @ count, a.iSomeField4 + @ count из #MaxMinПример перекрестного соединения #MaxMinEx б
set @ count = @ count + 1
конец </p>
GO
- создать индексы
создать индекс MaxMinExample_iSomeField1 для #MaxMinExample (iSomeField1)
создать индекс MaxMinExample_iSomeField2 на #MaxMinExample (iSomeField2)
создать индекс MaxMinExample_iSomeField3 для #MaxMinExample (iSomeField3)
создать индекс MaxMinExample_iSomeField4 для #MaxMinExample (iSomeField4)
создать индекс MaxMinExample_dtDate для #MaxMinExample (dtDate)
GO
объявите @ maxval1 int, @ maxval2 int, @ dtDateMin datetime, @ dtDateMax datetime, @ param1 int, @ param2 int, @ param3 int, @ param4 int
select @ param1 = 4, @ param2 = 5, @ param3 = 6, @ param4 = 7
select @ maxval1 = max (iField1), @ maxval2 = max (iField2), @dtDateMin = Min (dtDate), @ dtDateMax = Max (dtDate) из #MaxMinExample
где iSomeField1 = @ param1 и iSomeField2 = @ param2 и iSomeField3 = @ param3 и iSomeField4 = @ param4
выберите top 1 @ maxval1 = iField1 из #MaxMinExample, где iSomeField1 = @ param1 и iSomeField2 = @ param2 и iSomeField3 = @ param3 и iSomeField4 = @ param4 упорядочены по iField1 DESC
выберите top 1 @ maxval2 = iField2 из #MaxMinExample, где iSomeField1 = @ param1 и iSomeField2 = @ param2 и iSomeField3 = @ param3 и iSomeField4 = @ param4 упорядочены по iField2 DESC
выберите top 1 @dtDateMin = dtDate из #MaxMinExample, где iSomeField1 = @ param1 и iSomeField2 = @ param2 и iSomeField3 = @ param3 и iSomeField4 = @ param4 упорядочены по dtDate ASC
выберите top 1 @dtDateMax = dtDate из #MaxMinExample, где iSomeField1 = @ param1 и iSomeField2 = @ param2 и iSomeField3 = @ param3 и iSomeField4 = @ param4 упорядочены по dtDate DESC
Марк Бэкдал - www.dbghost.com - SQL Developer