CTE - это лучшая практика вместо временной таблицы?

Таблица данных "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; 

Где штраф за производительность? Вы случайно не вызываете эту процедуру один раз для каждой строки? Я не уверен, что это слишком упрощенная версия вашей процедуры, но я уверен, что вы можете переписать ее, чтобы она была короче и, скорее всего, быстрее.

Radu Gheorghiu 14.06.2019 10:23

Зачем вообще использовать для этого временную таблицу?

Larnu 14.06.2019 10:23

вы можете сделать все это в одном выражении

Martin Smith 14.06.2019 10:24

Ваша таблица Common.Import случайно не проиндексирована?

Matt 14.06.2019 10:24

Использование CTE или подзапроса и предложения OUTPUT было бы гораздо лучшей идеей. Нет необходимости в 4 утверждениях, когда это может быть 1.

Larnu 14.06.2019 10:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший способ был бы таким, как показано ниже. Это позволяет избежать загрузки ненужных операций в вашем текущем коде (я предполагаю, что 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.*;

Однако я рекомендую ОП, поскольку это предварительно скомпилированный объект, использование * - плохая идея; они должны заменить его именами столбцов. В противном случае, если определение Common.Import будет изменено, маловероятно, что SP будет вести себя так, как они ожидают.

Larnu 14.06.2019 10:30

Другие вопросы по теме