У меня есть запрос, который использует 3 функции и несколько разных представлений под ним, которые слишком сложны, чтобы публиковать их здесь. Странная вещь, которую я испытываю, заключается в том, что при выполнении запроса верхнего уровня наличие более 1 ключа поиска приводит к тому, что запрос занимает около часа, а разделение запроса на две части занимает около 5 секунд на запрос.
Вот запрос верхнего уровня:
Select *
from dbo.vwSimpleInvoice i
inner join dbo.vwRPTInvoiceLineItemDetail d on i.InvoiceID = d.InvoiceID
Когда я добавляю это предложение where:
Where i.InvoiceID = 109581
Выполнение запроса занимает около 3 секунд. Точно так же, когда я добавляю это предложение where:
Where i.InvoiceID = 109582
это занимает около 3 секунд.
Когда я добавляю это предложение where:
Where i.InvoiceID in (109581, 109582)
Мне пришлось убить запрос примерно через 50 минут, и он никогда не возвращает никаких результатов.
Это происходит на сервере удаленного клиента под управлением SQL Server 2008 R2 Express. Когда я запускаю его локально (также на SQL Server 2008 R2 Express), я не получаю большой задержки, последнее предложение where занимает около 30 секунд для возврата. Однако у клиента гораздо больше данных, чем у меня.
Любая идея, с чего начать устранение неполадок?
Редактировать:
После комментариев ниже я перестроил индексы и статистику, что улучшило производительность первых двух предложений where, но не повлияло на третье. Затем я поиграл с запросом и обнаружил, что если переписать его так:
Select *
from dbo.vwSimpleInvoice i
inner join
(Select * from dbo.vwRPTInvoiceLineItemDetail) d on i.InvoiceID = d.InvoiceID
Where i.InvoiceID in (109581, 109582)
Производительность возвращается к ожидаемому уровню примерно через 200 мс. Я теперь более озадачен, чем когда-либо, относительно того, что происходит...
Редактировать 2:
На самом деле, я ошибаюсь. Это не было переписыванием запроса, я случайно изменил предложение Where во время перезаписи на:
Where d.InvoiceID in (109581, 109582)
(Изменено i
на d
).
Все еще в недоумении, почему это имеет такое огромное значение для внутреннего соединения?
Дальнейшее редактирование:
Играя с этим еще дальше, я все еще не могу этого понять.
Select InvoiceId from tblInvoice Where CustomerID = 2000
возвращает:
80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389)
Прогоны: 31 строка возвращена за 110 мс.
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(Select InvoiceId from tblInvoice Where CustomerID = 2000)
Прогоны: 31 строка возвращена за 65 минут.