sql >> Databasteknik >  >> RDS >> Sqlserver

Varför saktar en fråga ner drastiskt om i WHERE-satsen en konstant ersätts med en parameter (som har samma värde)?

Som Martin föreslog i en kommentar under frågan är problemet att SQL-servern inte trycker ner predikatet från WHERE-satsen ordentligt - se länken i hans kommentar.

Det slutade med att jag skapade en användardefinierad funktion med tabellvärde och använde den med operatorn CROSS APPLY för att skapa vyn.

Låt oss se själva lösningen.

Användardefinierad funktion med tabellvärde

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
)

Visa

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

Fråga med konstant

SELECT * FROM TestView WHERE Id = 69

Fråga med parameter

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

Frågan med parmater körs i princip lika snabbt som frågan med konstanten.

Tack Martin och för de andra också!



  1. Hur använder man ajax för att uppdatera mysql db när tillståndet i kryssrutan ändras?

  2. Skulle singleton vara ett bra designmönster för en mikrobloggsajt?

  3. Data fylls i från en viss tabells datum istället för alla tabeller i sqlite

  4. Mysql välj för uppdatering - det låser inte målraderna. Hur ser jag till att det gör det?