sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué una consulta se ralentiza drásticamente si en la cláusula WHERE se reemplaza una constante por un parámetro (que tiene el mismo valor)?

Como sugirió Martin en un comentario debajo de la pregunta, el problema es que el servidor SQL no presiona correctamente el predicado de la cláusula WHERE; vea el enlace en su comentario.

Terminé creando una función con valores de tabla definida por el usuario y la uso con el operador CROSS APPLY para crear la vista.

Veamos la solución en sí.

Función con valores de tabla definida por el usuario

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 con constante

SELECT * FROM TestView WHERE Id = 69

Consulta con parámetro

DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id

La consulta con el parámetro se ejecuta básicamente tan rápido como la consulta con la constante.

¡Gracias Martin y por los demás también!