sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor sænkes en forespørgsel drastisk, hvis en konstant i WHERE-sætningen erstattes af en parameter (som har samme værdi)?

Som Martin foreslog i en kommentar under spørgsmålet, er problemet, at SQL-serveren ikke presser prædikatet fra WHERE-sætningen ordentligt ned - se linket i hans kommentar.

Jeg endte med at oprette en brugerdefineret funktion med tabelværdi og bruge den med CROSS APPLY-operatoren til at oprette visningen.

Lad os se selve løsningen.

Brugerdefineret funktion med tabelværdi

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
)

Vis

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

Forespørgsel med konstant

SELECT * FROM TestView WHERE Id = 69

Forespørgsel med parameter

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

Forespørgslen med parmateren udføres stort set lige så hurtigt som forespørgslen med konstanten.

Tak Martin og også til de andre!



  1. vælg første gang tre unikke værdier vises med sql

  2. Værten har ikke tilladelse til at oprette forbindelse til denne MySQL-server til klient-server-applikation

  3. mysql rækkefølge efter max matcher feltværdi

  4. Salesforce SOQL fra Apache OpenOffice