none
Otimizar consulta em várias tabelas RRS feed

  • Pergunta

  • Boa noite pessoa estou com uma certa dificuldade em otimizar a minha consulta em SQL SERVER tenho em meu banco de dados a seguinte estrutura (Imagem a abaixo) e estou precisando retornar os logradouros assim como o cep e o nome do bairro de uma cidade especifica, só que eu acho que script não está muito bom pois está demorando muito as consultas, alguém poderia me ajudar otimizar a consulta? Segue meu código abaixo e a estrutura do banco de dados.

    SELECT tbl_Logradouro.codigoLogradouro, tbl_Logradouro.nomeLogradouro, tbl_Bairro.nomeBairro, tbl_Logradouro.cepLogradouro FROM tbl_Cidade
    INNER JOINR tbl_Bairro ON tbl_Cidade.codigoCidade = tbl_Bairro.codigoCidade INNER JOIN tbl_Logradouro ON tbl_Bairro.codigoBairro = tbl_Logradouro.codigoBairro
    WHERE tbl_Cidade.codigoCidade = 3965 ORDER BY nomeLogradouro

    Fiz o relacionamento usando o Access apenas para a ilustração...



    • Editado J.AndersonSantos segunda-feira, 14 de setembro de 2015 01:11 Melhor visualização
    • Tipo Alterado Marcos SJ terça-feira, 15 de setembro de 2015 18:31 Adequação
    • Tipo Alterado Marcos SJ sexta-feira, 25 de setembro de 2015 17:31 Adequação
    segunda-feira, 14 de setembro de 2015 01:11

Respostas

  • J.AndersoSantos,

    Por padrão toda e qualquer chave estrangeira quando especificada no SQL Server é reconhecida internamente como um mecanismo de controle, pesquisa e organização dos dados.

    Mas a criação de um índice por parte do SQL Server para esta chave estrangeira não é algo obrigatório ou automático, vale ressaltar que caso venha a ser criado um índice para uma chave estrangeira, o mesmo será do tipo NonClustered.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:32
    terça-feira, 15 de setembro de 2015 18:10
  • Olá J.AndersonSantos,

    Algumas perguntas:

    - Esses campos que você está utilizando na clausula "ON", eles são FK's reais com índices?
    - Qual o tipo dos campos de código ?
    - Qual o volume de dados ?
    - O Banco de dados é DEV ou PROD? Se for PROD, como está o uso dele (em % de utilização ou volume de acessos)?

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:31
    segunda-feira, 14 de setembro de 2015 10:28
  • Um.. não sei se ele cria. Dá uma olhada para ver se tem os índices corretos de FK. Isso melhora MUITO a performance ;)

    Esse tipo de query não é para demorar nada para executar....

    Passa o Execution Plan desta consulta aqui no Fórum para eu dar uma olhada

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:32
    segunda-feira, 14 de setembro de 2015 13:59

Todas as Respostas

  • Olá J.AndersonSantos,

    Algumas perguntas:

    - Esses campos que você está utilizando na clausula "ON", eles são FK's reais com índices?
    - Qual o tipo dos campos de código ?
    - Qual o volume de dados ?
    - O Banco de dados é DEV ou PROD? Se for PROD, como está o uso dele (em % de utilização ou volume de acessos)?

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:31
    segunda-feira, 14 de setembro de 2015 10:28
  • Então Guilherme respondendo suas perguntas...

    - Os campos usados na clausula ON são chaves estrangeiras sim. (Quando você cria uma tabela e diz que um campo é chave estrangeira ele cria um índice neste campo?)

    - Os tipos do campo código são inteiros

    - O banco de dados possui quase 1 milhão de registros na tabela de logradouro.

    - O banco de dados é DEV

    segunda-feira, 14 de setembro de 2015 11:46
  • Um.. não sei se ele cria. Dá uma olhada para ver se tem os índices corretos de FK. Isso melhora MUITO a performance ;)

    Esse tipo de query não é para demorar nada para executar....

    Passa o Execution Plan desta consulta aqui no Fórum para eu dar uma olhada

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:32
    segunda-feira, 14 de setembro de 2015 13:59
  • J.AndersoSantos,

    Por padrão toda e qualquer chave estrangeira quando especificada no SQL Server é reconhecida internamente como um mecanismo de controle, pesquisa e organização dos dados.

    Mas a criação de um índice por parte do SQL Server para esta chave estrangeira não é algo obrigatório ou automático, vale ressaltar que caso venha a ser criado um índice para uma chave estrangeira, o mesmo será do tipo NonClustered.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos SJ sexta-feira, 25 de setembro de 2015 17:32
    terça-feira, 15 de setembro de 2015 18:10
  • J.AndersoSantos,

    Por padrão toda e qualquer chave estrangeira quando especificada no SQL Server é reconhecida internamente como um mecanismo de controle, pesquisa e organização dos dados.

    Mas a criação de um índice por parte do SQL Server para esta chave estrangeira não é algo obrigatório ou automático, vale ressaltar que caso venha a ser criado um índice para uma chave estrangeira, o mesmo será do tipo NonClustered.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Funcionou direitinho.. Valeu pela ajuda...

    quinta-feira, 17 de setembro de 2015 11:19