none
Operador remote query RRS feed

  • Pergunta

  • Pessoal eu tenho a consulta abaixo que esta levando horas pra executar e creio ser por conta do linked server, qual alguma outra forma que poderia fazer para otimizar esse linked server.

    No plano o operador com maior custo é o "remote query"

    SET STATISTICS TIME, IO ON
    GO


    USE MARKETING_CRM
    GO

    DECLARE @DATA_ULTIMA_ATUALIZACAO AS DATE
    DECLARE @DATA_ULTIMA_ATUALIZACAO_FIM AS DATE

    -- Verifica a última data de atualização da tabela
    SET @DATA_ULTIMA_ATUALIZACAO = '2022-09-01'
    SET @DATA_ULTIMA_ATUALIZACAO_FIM = '2022-09-01'


    SELECT CAST(TABLE_43.COLUNA1 AS DATE) as DATA_VENDA,
    CAST(TABLE_43.COLUNA2 AS smallint) as COD_LOJA,
    TABLE_43.COLUNA3 AS ID_PDV,
    TABLE_43.COLUNA4 AS ID_OPERACAO,
    TABLE_43.COLUNA5 AS ID_TRANSACAO,
    convert(bigint,TABLE_43.COLUNA6) AS COD_MATERIAL,
    m.DESC_MATERIAL,
    CASE
    WHEN ISNUMERIC(TABLE_45.COLUNA7) = 1 THEN TABLE_45.COLUNA7
    ELSE NULL
    END AS ID_CLIENTE,

    CASE
    WHEN COLUNA8 > '0' THEN COLUNA8 
    WHEN COLUNA9 > '1' THEN COLUNA9 
    WHEN COLUNA7 > '0' THEN COLUNA7 
    ELSE '0'
    END AS CPF_CNPJ,
    Case TABLE_43.COLUNA10
    when 0 then 'PISO'
    WHEN 1 then 'CONSUMO INTERNO'
    WHEN 2 then 'TABELA CARTAO'
    WHEN 3 then 'TELEVENDAS'
    WHEN 4 then 'LANCHONETE'
    END AS CANAL_VENDA,
    NULL AS EAN,
    m.SETOR,
    m.CATEGORIA,
    m.SUB_CATEGORIA,
    m.MARCA,
    m.FAMILIA,
    m.SUB_FAMILIA,
    m.UNIDADE_MEDIDA,
    m.GRUPO_MERCADORIA,
    SUM(dbo.fn_calcula_quantidade_menor_unidade (convert(bigint,TABLE_43.COLUNA6), TABLE_43.TABLE_43ah, CAST(TABLE_43.COLUNA2 AS smallint), TABLE_43.TABLE_43AO)) QTDE_VENDA,
    NULL AS VALOR_UNITARIO,
    SUM(TABLE_43.TABLE_43AP) VALOR_VENDA_SEM_DESCONTO,
    SUM(TABLE_43.TABLE_43AQ) VALOR_DESCONTO,
    SUM(TABLE_43.val_liquido) VALOR_VENDA,
    m.MARCA_PROPRIA,
    m.PRIMEIRO_PRECO,
    m.INSTITUCIONAL,
    m.CENTRO_LUCRO,
    m.COMPRADOR

    from LINKED.DATABASE1.dbo.TABLE_45 TABLE_45 with (nolock) 

    inner join LINKED.DATABASE1.dbo.TABLE_43 TABLE_43 with (nolock) 

    on TABLE_45.COLUNA2=TABLE_43.COLUNA2
    and TABLE_45.COLUNA 1=TABLE_43.COLUNA 1
    and TABLE_45.COLUNA3=TABLE_43.COLUNA3
    and TABLE_45.COLUNA4=TABLE_43.COLUNA4
    and TABLE_45.COLUNA5=TABLE_43.COLUNA5

    left join DATABASE2.dbo.TBL_PRODUTO m with (nolock) 
    on m.COD_MATERIAL = convert(bigint,TABLE_43.COLUNA6)

    where TABLE_45.COLUNA 1 BETWEEN @DATA_ULTIMA_ATUALIZACAO AND @DATA_ULTIMA_ATUALIZACAO_FIM
    and TABLE_45ae in (1505,1509)
    and TABLE_45.cupom_cancelamento=0
    and TABLE_43.COLUNA10 in (0,3,4)

    GROUP BY CAST(TABLE_43.COLUNA 1 AS DATE),
    CAST(TABLE_43.COLUNA2 AS smallint),
    TABLE_43.COLUNA3,
    TABLE_43.COLUNA4,
    TABLE_43.COLUNA5,
    convert(bigint,TABLE_43.COLUNA6),
    m.DESC_MATERIAL,
    CASE
    WHEN ISNUMERIC(TABLE_45.COLUNA7) = 1 THEN TABLE_45.COLUNA7
    ELSE NULL
    END ,

    CASE
    WHEN COLUNA8 > '0' THEN COLUNA8 -- NF Paulista
    WHEN COLUNA9 > '1' THEN COLUNA9 -- Aniversario
    WHEN COLUNA7 > '0' THEN COLUNA7 -- App
    ELSE '0'
    END,

    Case TABLE_43.COLUNA10
    when 0 then 'PISO'
    WHEN 1 then 'CONSUMO INTERNO'
    WHEN 2 then 'TABELA CARTAO'
    WHEN 3 then 'TELEVENDAS'
    WHEN 4 then 'LANCHONETE'
    END,
    --TABLE_43.TABLE_43ah,
    m.SETOR,
    m.CATEGORIA,
    m.SUB_CATEGORIA,
    m.MARCA,
    m.FAMILIA,
    m.SUB_FAMILIA,
    m.UNIDADE_MEDIDA,
    m.GRUPO_MERCADORIA,
    m.MARCA_PROPRIA,
    m.PRIMEIRO_PRECO,
    m.INSTITUCIONAL,
    m.CENTRO_LUCRO,
    m.COMPRADOR

    segunda-feira, 7 de novembro de 2022 19:39

Todas as Respostas

  • Renata,

    A princípio tentar reescrever os joins poderia ser um caminho, como também, o uso das variáveis dentro da cláusula where podem estar fazendo com que sua query não venha a ser Sargable.

    Um detalhe importante é o uso do CASE, provavelmente este operador deve estar provocando um aumento no custo de processamento.

    Eu pensaria na possibilidade de transformar esta query em uma Stored Procedure e a mesma ser executada no servidor de destino, fazendo com que o linked server devolva somente os dados.


    Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 8 de novembro de 2022 21:46
  • Olá Renata,
     
    Alguma novidade sobre a consulta feita?
     
    A resposta fornecida foi útil?
     
    Obrigado por usar os fóruns do MSDN.
     
    Pablo Garcia
    ____________________________
    Por favor, lembre-se de "Marcar respostas" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde.
     
    Se você tiver algum elogio ou reclamação sobre o suporte do MSDN, sinta-se à vontade para entrar em contato com MSDNFSF@microsoft.com
    quinta-feira, 10 de novembro de 2022 18:45