SQL Server даже смотрит на таблицу при присоединении на переменной, которая возвращает false?

Вы могли бы хотеть взглянуть на Лассо Процесса .

5
задан adam0101 8 December 2009 в 00:07
поделиться

2 ответа

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

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

7
ответ дан 14 December 2019 в 04:39
поделиться

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

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 появляется в обоих планах выполнения, но во втором плане все строки фильтруются до того, как произойдет соединение. Обратите внимание, что они не исключаются полностью из запроса.

1
ответ дан 14 December 2019 в 04:39
поделиться