SQL не существует слишком медленно в OpenQuery - PullRequest
3 голосов
/ 30 апреля 2019

В настоящее время я использую 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

Изменена переменная таблицы во временную таблицу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...