SQL Server даже смотрит на таблицу при объединении с переменной, которая возвращает false? - PullRequest
5 голосов
/ 08 декабря 2009

Если я присоединю таблицу A к таблице B следующим образом ...

select A.* from A 
left outer join B on A.Id = B.aId and @param = 'someValue'

и @param не равно 'someValue', SQL Server даже пытается сопоставить записи из таблицы B или он достаточно умен, чтобы знать, что условие никогда не будет выполнено?

Ответы [ 2 ]

7 голосов
/ 08 декабря 2009

Таким образом, хотя в определенном контексте вы можете обнаружить, что когда @param имеет другое значение, чем у таблицы внешнего соединения, никогда не может быть probed , вам не следует полагаться на это для корректности. Обратите внимание, что щуп означает, что фактические значения ищутся в таблице. Информация метаданных будет всегда проверяться. Например, вы не можете обмануть и попросить присоединиться к несуществующей таблице.

В частности, не пытайтесь создать один запрос, в котором должно быть два разных запроса (один, который присоединяется, другой нет).

1 голос
/ 08 декабря 2009

Этот код проще поместить в новый ответ, чем в комментарий, но это показывает немного того, что говорит Ремус:

CREATE PROCEDURE dbo.Test_Params
    @param1 INT
WITH RECOMPILE
AS
BEGIN
    SELECT
        o.object_id,
        c.object_id
    FROM
        sys.objects o
    LEFT OUTER JOIN sys.columns c ON
        c.object_id = o.object_id AND
        @param1 = 1
    OPTION
        (RECOMPILE)
END
GO


EXEC dbo.Test_Params 1
EXEC dbo.Test_Params 2

Если вы создадите план выполнения для двух операторов EXEC, вы увидите, что sys.columns появляется в обоих планах выполнения, но во втором все строки фильтруются перед выполнением объединения. Обратите внимание, что они не полностью закорочены в запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...