Таблица данных "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;
Зачем вообще использовать для этого временную таблицу?
вы можете сделать все это в одном выражении
Ваша таблица Common.Import
случайно не проиндексирована?
Использование CTE или подзапроса и предложения OUTPUT
было бы гораздо лучшей идеей. Нет необходимости в 4 утверждениях, когда это может быть 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 будет вести себя так, как они ожидают.
Где штраф за производительность? Вы случайно не вызываете эту процедуру один раз для каждой строки? Я не уверен, что это слишком упрощенная версия вашей процедуры, но я уверен, что вы можете переписать ее, чтобы она была короче и, скорее всего, быстрее.