Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que uma consulta diminui drasticamente se na cláusula WHERE uma constante é substituída por um parâmetro (com o mesmo valor)?


Como Martin sugeriu em um comentário sob a pergunta, o problema é que o SQL Server não empurra corretamente o predicado da cláusula WHERE - veja o link em seu comentário.

Acabei criando uma função com valor de tabela definida pelo usuário e a usei com o operador CROSS APPLY para criar a exibição.

Vamos ver a solução em si.

Função com valor de tabela definida pelo usuário
CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
RETURNS TABLE 
AS
RETURN 
(
    WITH
    Hierarchy (Id,  ParentId, Data, Depth)
    AS(
    SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
    UNION ALL
    SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
        FROM Hierarchy h
            INNER JOIN Test t ON t.Id = h.ParentId
    )
    SELECT * FROM Hierarchy
)

Ver
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
    Test AS t
    CROSS APPLY TestFunction(Id) as f

Consulta com constante
SELECT * FROM TestView WHERE Id = 69

Consulta com parâmetro
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id

A consulta com o parmater executa basicamente tão rápido quanto a consulta com a constante.

Obrigado Martin e para os outros também!