Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо една заявка се забавя драстично, ако в клаузата WHERE константа е заменена с параметър (със същата стойност)?

Както предложи Мартин в коментар под въпроса, проблемът е, че SQL сървърът не натиска правилно предиката от клаузата WHERE - вижте връзката в неговия коментар.

В крайна сметка създадох дефинирана от потребителя таблична функция и я използвах с оператора CROSS APPLY за създаване на изглед.

Нека видим самото решение.

Дефинирана от потребителя таблично-стойностна функция

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
)

Преглед

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

Заявка с константа

SELECT * FROM TestView WHERE Id = 69

Заявка с параметър

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

Заявката с parmater се изпълнява основно толкова бързо, колкото и заявката с константата.

Благодаря ти, Мартин, както и за останалите!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избор на процесор за SQL Server 2014 – част 1

  2. JSON_VALUE() Примери в SQL Server (T-SQL)

  3. Внедряване на релация едно към нула или едно в SQL Server

  4. Оператор insert exec не може да бъде вложен

  5. CURRENT_TIMESTAMP Примери в SQL Server (T-SQL)