sql >> Databáze >  >> RDS >> Sqlserver

Proč se dotaz drasticky zpomalí, pokud je v klauzuli WHERE konstanta nahrazena parametrem (se stejnou hodnotou)?

Jak Martin naznačil v komentáři pod dotazem, problém je v tom, že SQL server správně nepotlačí predikát z klauzule WHERE - viz odkaz v jeho komentáři.

Nakonec jsem vytvořil uživatelsky definovanou tabulkovou funkci a použil jsem ji s operátorem CROSS APPLY pro vytvoření pohledu.

Podívejme se na samotné řešení.

Uživatelem definovaná tabulková funkce

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
)

Zobrazit

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

Dotaz s konstantou

SELECT * FROM TestView WHERE Id = 69

Dotaz s parametrem

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

Dotaz s parametrem se provede v podstatě stejně rychle jako dotaz s konstantou.

Děkuji Martine a také za ostatní!



  1. dotaz na PSČ geoip

  2. Existuje příkaz SQL, který rozdělí to, co by byly 2 dlouhé sloupce, na několik párů sloupců?

  3. Pochopení příkazů PIVOT, UNPIVOT a Reverse PIVOT

  4. Jak udělat RAND() deterministický v SQL Server