Я использую SQL Server 2008. Я создал большой поисковый запрос (содержащийся в определенной пользователем функции) со многими необязательными параметрами.Упрощенная версия результата выглядит примерно так:
Declare @optionalSubTableParameter as userDefinedTableType READONLY
select id
from table t
--here is optional parameter 1 (there are quite a few of these)
outer apply(
select top (1) st.item
from subTable st
inner join @optionalSubTableParameter ostp
on (ostp.value = st.item or ostp.value is null)
where st.index = t.index
and ostp.value is not null
-- also tried: (select top(1) * from @optionalSubTableParameter) is not null
)someParam
where (someParam.item is not null
or (select top(1) * from @optionalSubTableParameter) is null)
Итак, проблема заключается в плане выполнения, я, кажется, трачу время на:
поиск кластеризованного индекса (кластеризовано)
[subTable]. [IX_subTableIndex ..
Стоимость: 8%
Я знаю 8% не много, но это повторяется 6 раз (и скоро будет еще несколько), так что это уже 48% моего времени выполнения.
Я думал, что проверка (@optionalSubTableParameter не являетсяnull) в пределах внешнего применения, я бы избегал вычислений, таких как поиск кластеризованного индекса по ненужной таблице (если не указан параметр).Если кто-нибудь может помочь объяснить, есть ли способ для меня избежать этого вычисления, это было бы здорово!
Заранее спасибо, и дайте мне знать, если я могу уточнить что-нибудь (это чрезвычайно упрощенная версиязапрос, который я на самом деле выполняю).
Я прошу прощения, если есть какие-либо повторяющиеся сообщения, но мне не повезло найти ответ самостоятельно.