sql >> Database >  >> RDS >> Sqlserver

Waarom vertraagt ​​een query drastisch als in de WHERE-component een constante wordt vervangen door een parameter (met dezelfde waarde)?

Zoals Martin in een opmerking onder de vraag suggereerde, is het probleem dat SQL-server het predikaat van de WHERE-clausule niet goed naar beneden duwt - zie de link in zijn opmerking.

Uiteindelijk heb ik een door de gebruiker gedefinieerde tabelwaardefunctie gemaakt en deze gebruikt met de CROSS APPLY-operator voor het maken van de weergave.

Laten we de oplossing zelf bekijken.

Door gebruiker gedefinieerde functie met tabelwaarde

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
)

Bekijken

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

Query met constante

SELECT * FROM TestView WHERE Id = 69

Query met parameter

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

De query met de parameter wordt in principe net zo snel uitgevoerd als de query met de constante.

Bedankt Martin en ook voor de anderen!



  1. MySQL retourneert BIT-waarden altijd als blanco

  2. 12c Gegevensbestanden online verplaatsen

  3. Waarom geeft WHERE column =NULL geen fout in SQL Server?

  4. Hoe partities uit tabellen over meerdere schema's te laten vallen?