Повысить производительность Open Query - PullRequest
2 голосов
/ 03 июня 2019

У меня небольшая проблема с этим запросом.Он возвращает мне около 13 тысяч строк и занимает около 12 секунд или более.

SELECT 
    hla.Id,
    hc.Nome AS Colaborador,
    hla.UAP,
    hra.Referencia, 
    hra.QtdAbastecimento, 
    hra.QtdPecasPorCaixa, 
    hra.QtdCaixas,
    A.Etiqueta, 
    A.Localizacao
FROM 
    hListasAbastecimento hla
INNER JOIN hColaboradores hc
ON hc.Id = hla.ColaboradorId
INNER JOIN 
    hReferenciasAbastecimento hra
ON hla.Id = hra.ListaAbastecimentoId
LEFT JOIN OPENQUERY(MACPAC, 
    'SELECT 
        FET001.ET0102 AS Referencia,
        FET001.ET0101 AS Etiqueta, 
        FET001.ET0109 AS Localizacao
    FROM 
        AUTO.D805DATPOR.FET001 FET001
    WHERE FET001.ET0104 = ''POE'' 
    AND FET001.ET0105 = ''DIS''
    ORDER BY FET001.ET0101 ASC ') A
ON A.Referencia = hra.Referencia 
WHERE hla.Id = @Id

Я не уверен, что я могу сделать, чтобы увеличить производительность этого.Я уже использую единственный первичный ключ для связи обеих таблиц.У меня также нет контроля над связанным сервером, поэтому я не могу создавать новые индексы

ОБНОВЛЕНИЕ

Я узнал от коллеги, что на связанном сервере есть таблицаэто может помочь мне получить результаты по "UAP", который занимает всего 4 секунды, чтобы обойти 1700 строк, что мне и нужно

ALTER PROCEDURE GenerateListaAbastecimento
    @Id INT,
    @UAP NVARCHAR(20)
    AS
BEGIN

        CREATE TABLE #tempTable
        (
            Id INT PRIMARY KEY,
            Referencia NVARCHAR(15),
            Etiqueta INT,
            Localizacao NVARCHAR(20)

            UNIQUE(Id, Etiqueta)
        )

        DECLARE @SQL NVARCHAR(MAX)
        SELECT @SQL ='INSERT INTO #tempTable    
        SELECT 
            Id, 
            Referencia, 
            Etiqueta, 
            Localizacao 
        FROM OPENQUERY(MACPAC, 
        ''SELECT 
            ROW_NUMBER() OVER(ORDER BY FET001.ET0101 ASC) AS Id,
            A.RH6001 as Referencia, 
            FET001.ET0101 AS Etiqueta, 
            FET001.ET0109 AS Localizacao
        FROM AUTO.D805DATPOR.TRP060H AS A
        LEFT JOIN AUTO.D805DATPOR.FET001 FET001
        ON FET001.ET0102 = A.RH6001
        AND FET001.ET0104 = ''''POE'''' 
        AND FET001.ET0105 = ''''DIS'''' 
        AND A.RH6002 = N'''  + QUOTENAME(@UAP,N'''') +  N''' '')'   

        EXEC sp_executesql @SQL

    SELECT 
        hla.Id,
        hc.Nome AS Colaborador,
        hla.UAP,
        hra.Referencia, 
        hra.QtdAbastecimento, 
        hra.QtdPecasPorCaixa, 
        hra.QtdCaixas,
        A.Etiqueta, 
        A.Localizacao
    FROM 
        hListasAbastecimento hla
    INNER JOIN hColaboradores hc
    ON hc.Id = hla.ColaboradorId
    INNER JOIN 
        hReferenciasAbastecimento hra
    ON hla.Id = hra.ListaAbastecimentoId
    LEFT JOIN #tempTable A
    ON A.Referencia = hra.Referencia 
    WHERE hla.Id = @Id
    ORDER BY A.Etiqueta ASC

    DROP TABLE #tempTable

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