Otimização da consulta SQL envolvendo rotas

Patrícia Diniz 0 Pontos de reputação
2025-05-15T14:02:44.1766667+00:00

Pessoal, bom dia! Estou enfrentando um problema com uma consulta que está em execução há mais de dois dias. Já utilizei essa mesma lógica anteriormente com um volume de dados menor e funcionou bem, mas agora, com um conjunto maior, sem resposta. Tenho duas tabelas:

  • A primeira contém informações de rotas (origem, UF, destino, UF) e extensão;

A segunda também contém dados de rotas (origem, UF, destino, UF) junto com outras informações.

O objetivo é incluir a extensão da rota da primeira tabela na segunda. No entanto, em alguns casos, a rota exata (origem → destino) não existe na tabela de referência, mas a rota invertida (destino → origem) pode estar presente — e, nesses casos, preciso considerar essa extensão. Ou seja, se não encontrar rota (origem, UF, destino, UF) da primeira com rota (origem, UF, destino, UF) da segunda, tentar encontrar rotas (origem, UF, destino, UF) da segunda com rota (destino, UF, origem, UF).

Vou compartilhar a consulta que estou utilizando para ver se conseguem me ajudar a otimizar ou corrigir o problema. Muito obrigada!

SELECT DISTINCT

[dbo].[BILHETE].[ano],

[dbo].[BILHETE].[mes],

[dbo].[BILHETE].[municipio_origem],

[dbo].[BILHETE].[uf_origem],

[dbo].[BILHETE].[municipio_destino],

[dbo].[BILHETE].[uf_destino],

[dbo].[BILHETE].[tipo_servico],

[dbo].[BILHETE].[tipo_gratuidade],

[dbo].[BILHETE].[tarifa],

[dbo].[BILHETE].[bilhete],

[dbo].[KM_BRASIL].[extensao]

INTO NOVO_BILHETE

FROM [dbo].[BILHETE],[dbo].[KM_BRASIL]

WHERE

[dbo].[BILHETE].[municipio_origem]=[dbo].[KM_BRASIL].[munrft n micipio_origem] and

[dbo].[BILHETE].[uf_origem]=[dbo].[KM_BRASIL].[uf_origem] and

[dbo].[BILHETE].[municipio_destino]=[dbo].[KM_BRASIL].[municipio_destino] and

[dbo].[BILHETE].[uf_destino]=[dbo].[KM_BRASIL].[uf_destino] or

[dbo].[BILHETE].[municipio_origem]=[dbo].[KM_BRASIL].[municipio_destino] and

[dbo].[BILHETE].[uf_origem]=[dbo].[KM_BRASIL].[uf_destino] and

[dbo].[BILHETE].[municipio_destino]=[dbo].[KM_BRASIL].[municipio_origem] and

[dbo].[BILHETE].[uf_destino]=[dbo].[KM_BRASIL].[uf_origem]

Centro da Comunidade | Não monitorado
0 comentários Sem comentários
{count} votos

1 resposta

Classificar por: Mais útil
  1. Dio Xavier 7,325 Pontos de reputação Moderador Voluntário
    2025-05-18T13:01:41.56+00:00

    Olá Patrícia,

    Bem vinda à Comunidade Microsoft Q&A

    O problema principal da sua consulta é a falta de parênteses adequados na cláusula WHERE, o que causa combinações cartesianas desnecessárias e possivelmente está levando à execução demorada. Além disso, a consulta pode ser otimizada utilizando JOIN com LEFT JOIN e uma lógica mais eficiente para considerar a rota direta e invertida.

    Segue abaixo uma versão otimizada, técnica e didática da sua consulta:


    SELECT DISTINCT

    B.ano,
    
    B.mes,
    
    B.municipio_origem,
    
    B.uf_origem,
    
    B.municipio_destino,
    
    B.uf_destino,
    
    B.tipo_servico,
    
    B.tipo_gratuidade,
    
    B.tarifa,
    
    B.bilhete,
    
    COALESCE(KM1.extensao, KM2.extensao) AS extensao
    

    INTO NOVO_BILHETE

    FROM dbo.BILHETE B

    LEFT JOIN dbo.KM_BRASIL KM1

    ON B.municipio_origem = KM1.municipio_origem
    

    AND B.uf_origem = KM1.uf_origem

    AND B.municipio_destino= KM1.municipio_destino

    AND B.uf_destino = KM1.uf_destino

    LEFT JOIN dbo.KM_BRASIL KM2

    ON B.municipio_origem = KM2.municipio_destino
    

    AND B.uf_origem = KM2.uf_destino

    AND B.municipio_destino= KM2.municipio_origem

    AND B.uf_destino = KM2.uf_origem

    =============================================================

    Dicas Adicionais

    • Crie índices nas colunas usadas nas junções (municipio_origem, uf_origem, municipio_destino, uf_destino) para acelerar a execução.

    Certifique-se de que os campos de texto tenham o mesmo formato e capitalização.

    0 comentários Sem comentários

Sua resposta

As respostas podem ser marcadas como Respostas Aceitas pelo autor da pergunta, o que ajuda os usuários a saber a resposta que resolveu o problema do autor.