CTE - это лучшая практика, а не временная таблица? - PullRequest
0 голосов
/ 14 июня 2019

Создание таблицы данных «Common.XXX» во временной таблице.Но это создает некоторые проблемы с производительностью.Как я могу удалить временную таблицу?ИЛИ что вы посоветуете?Какова лучшая практика?Использование CTE лучше, чем временная таблица.Я прав?Как я могу улучшить производительность ниже запроса?

CREATE PROCEDURE [Common].[GetXYZ]  
AS  
BEGIN  
    SET NOCOUNT ON;  

    BEGIN TRAN;  
    DROP TABLE IF EXISTS #xxx;  

    SELECT TOP (1)  
        *  
    INTO #xxx  
    FROM Common.Import WITH (UPDLOCK)  
    WHERE State = 1  
    ORDER BY Id;  

    UPDATE Common.Import  
    SET State = 2  
    WHERE Id IN (  
                    SELECT Id FROM #xxx  
                );  

    UPDATE #xxx  
    SET State = 2;  

    SELECT *  
    FROM #xxx;  
    COMMIT;  
END; 

1 Ответ

3 голосов
/ 14 июня 2019

Лучший способ был бы как ниже. Это позволяет избежать загрузки ненужных операций в вашем текущем коде (я предполагаю, что Id уникален)

WITH CTE AS
(
  SELECT TOP (1) * 
    FROM Common.XXX WITH (UPDLOCK)  
    WHERE State = 1  
    ORDER BY Id
)
UPDATE CTE
SET  State = 2
OUTPUT INSERTED.*;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...