В настоящее время я использую NOT EXISTS для копирования данных с удаленного сервера db2 для обновления моей локальной таблицы. Эта процедура выполняется каждую неделю только в течение 1 дня. Проблема в том, что для его выполнения требуется более 40 секунд, если он не кэширован.
В основном мне нужно вставить записи по 2 столбцам: «Ссылки» и «UAP» («Производственная единица»), где 1 «Ссылка» может иметь много UAP. Я предполагаю, что запрос становится медленнее из-за обоих условий в предложении where.
ALTER PROCEDURE CopyReferenciasFromPDP
AS
BEGIN
DECLARE @NumTurnos int,
@NumPab int,
@AlcanceAbastecimento int,
@QtdMin int,
@QtdMax int
SET @NumTurnos = 3
SET @NumPab = 6
SET @AlcanceAbastecimento = 3
SET @QtdMin = 3
SET @QtdMax = 12
INSERT INTO Parametros
SELECT
Referencia,
UAP,
@NumTurnos AS NumTurnos,
@NumPab AS NumPAB,
@AlcanceAbastecimento AS AlcanceAbastecimento,
@QtdMin AS QtdMin,
@QtdMax AS QtdMax
FROM OPENQUERY(MACPAC,
'SELECT
A.RH6001 as Referencia,
A.RH6002 as UAP
FROM AUTO.D805DATPOR.TRP060H AS A
WHERE (A.RH6001 Not Like ''FS%'')
AND A.RH6030 <> 0') M
WHERE
NOT EXISTS
(
SELECT * FROM Parametros P
WHERE M.Referencia = P.Referencia
AND M.UAP = P.UAP
)
END
Как я могу увеличить производительность? Или есть более быстрые альтернативы тому, где не существует?
Также openquery возвращает в среднем 2 тыс. Записей в неделю, хотя большинство записей всегда одинаковы.
ЗАКЛЮЧИТЕЛЬНЫЙ РЕЗУЛЬТАТ
Вот окончательное решение. Я использовал переменную таблицы, как предложено @ scsimon
ALTER PROCEDURE CopyReferenciasFromPDP
AS
BEGIN
DECLARE @NumTurnos INT,
@NumPab INT,
@AlcanceAbastecimento INT,
@QtdMin INT,
@QtdMax INT
SET @NumTurnos = 3
SET @NumPab = 6
SET @AlcanceAbastecimento = 3
SET @QtdMin = 3
SET @QtdMax = 12
CREATE TABLE #tempTable
(
Id INT PRIMARY KEY,
Referencia VARCHAR(15),
UAP NVARCHAR(20),
NumTurnos INT,
NumPab INT,
AlcanceAbastecimento INT,
QtdMin INT,
QtdMax INT
UNIQUE (Id)
)
INSERT INTO #tempTable
SELECT
ROW_NUMBER() OVER(ORDER BY Referencia ASC),
Referencia,
UAP,
@NumTurnos AS NumTurnos,
@NumPab AS NumPAB,
@AlcanceAbastecimento AS AlcanceAbastecimento,
@QtdMin AS QtdMin,
@QtdMax AS QtdMax
FROM OPENQUERY(MACPAC,
'SELECT
A.RH6001 as Referencia,
A.RH6002 as UAP
FROM AUTO.D805DATPOR.TRP060H AS A
WHERE (A.RH6001 Not Like ''FS%'')
AND A.RH6030 <> 0')
INSERT INTO
Parametros
SELECT
Referencia,
UAP,
NumTurnos,
NumPab,
AlcanceAbastecimento,
QtdMin,
QtdMax
FROM
#tempTable M
WHERE
NOT EXISTS
(
SELECT * FROM Parametros P
WHERE M.Referencia = P.Referencia
AND M.UAP = P.UAP
)
DROP TABLE #tempTable
END
EDIT
Изменена переменная таблицы во временную таблицу