Я не уверен, что вы хотите оптимизировать объединение. Это будет означать, что у вас будет как минимум два разных плана в зависимости от параметра, что означает, что он не будет оптимальным (или потенциально даже действительным), если параметр предоставлен, а кэшированный план хранится с NULL
(или наоборот). ). Если это то, чего вы в конечном итоге хотите достичь, используйте две разные хранимые процедуры и позвольте приложению решать, какую из них вызывать, основываясь на том, заполнен параметр или нет.
Но делайте это только в том случае, если вы действительно наблюдаете значительные различия в плане / производительности. Как утверждает @gbn, я сомневаюсь, что в этом случае вы увидите огромную разницу в производительности, если только таблица с заголовком не будет огромной и неиндексированной (или не проиндексированной оптимально). Типичный подход к этому - сравнить значение ИЛИ проверить, что значение равно NULL
. Многопроцессный подход гораздо более утомителен для поддержания, как правило, с небольшой выгодой, даже с одним необязательным параметром, и он просто соединяется с более чем одним необязательным параметром.
Для очень хорошего фонового чтения, ознакомьтесь со статьей Эрланда Соммарскога о Условиях динамического поиска ( версия, специфичная для 2008 ).