Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi une requête ralentit-elle drastiquement si dans la clause WHERE une constante est remplacée par un paramètre (ayant la même valeur) ?

Comme Martin l'a suggéré dans un commentaire sous la question, le problème est que le serveur SQL ne pousse pas correctement le prédicat de la clause WHERE - voir le lien dans son commentaire.

J'ai fini par créer une fonction table définie par l'utilisateur et l'utiliser avec l'opérateur CROSS APPLY pour créer la vue.

Voyons la solution elle-même.

Fonction de table définie par l'utilisateur

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
)

Afficher

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

Requête avec constante

SELECT * FROM TestView WHERE Id = 69

Requête avec paramètre

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

La requête avec le paramètre s'exécute fondamentalement aussi vite que la requête avec la constante.

Merci Martin et pour les autres aussi !