none
View com subconsulta ou join? plano de execução RRS feed RRS feed

  • Pergunta

  • Ola pessoal

    estou com uma dúvida referente a plano de execução quando consultamos uma VIEW.

    um exemplo bem simples para ilustrar:
    Criei uma view "Estoque", e quando utilizada, pode necessitar a descrição do produto, ou não.

    create view Estoque as (
        select est.CodigoEmpresa, est.CodigoProduto, est.QuantidadeEstoque
        , (select prod.Descricao from tab_produtos prod where prod.Codigo = est.CodigoProduto) as DescricaoProduto
        from ProdutosEstoque est
    )

    create view Estoque2 as (
        select est.CodigoEmpresa, est.CodigoProduto, est.QuantidadeEstoque, prod.Descricao as DescricaoProduto
        from ProdutosEstoque est
        Inner Join Produtos prod on prod.Codigo = est.CodigoProdutos
    )

    Fiz com Inner Join com a tabela de produtos, e com subconsulta

    Observei o plano de execução gerado por elas, em relação a diferença quando é selecionado "*"  ou cada campo separado (selecionando todos exceto DescricaoProduto)

    Select est.* from Estoque est
    Select est.CodigoEmpresa, est.CodigoProduto, est.QuantidadeEstoque from Estoque est

    Select est.* from Estoque2 est
    Select est.CodigoEmpresa, est.CodigoProduto, est.QuantidadeEstoque from Estoque2 est


    Para minha surpresa, o plano de execução quando utilizada a view Estoque com o SUBSELECT não percorreu a tabela de produtos (apenas ProdutosEstoque diretamente), sendo possivelmente mais performática quando não necessita o campo da descrição do produto.
    Enquanto para a view Estoque2, o plano de execução fica um pouco diferente selecionando * ou os campos, porém, sempre percorre a tabela de produtos.

    É isso mesmo? Sera que se aplica a casos mais complexos?

    E , existe a indicação de fazer desta forma?
    Será que tem diferença na prática?

    Obrigado

    Julio C.

    terça-feira, 20 de outubro de 2020 12:52

Todas as Respostas

  • Bom dia,

    Julio, não sei se é isso que está provocando essa diferença mas reparei que a view Estoque está utilizando a tabela tab_produtos e a view Estoque2 está utilizando a tabela Produtos.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 20 de outubro de 2020 13:36
  • Julio,

    Você esta consultando as fontes de dados corretas? 

    Tive a mesma observação e percepção do Gapimex.


    Pedro Antonio Galvão Junior [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]

    quarta-feira, 21 de outubro de 2020 15:58
  • Ola.

    A situação que eu postei é apenas um exemplo para ilustrar o comportamento (me equivoquei e escrevi diferente o nome da tabela)

    De lá para cá, tive uma idéia do que pode ser,

    Por causa do INNER JOIN, o mecanismo precisa varrer a tabela, independentemente se o campo está no Select que utiliza a view ou não.

    Diferentemente, no caso da view com a subconsulta, se não for selecionado o campo, o mecanismo desconsidera a tabela.

    -----

    Para ilustrar de outra forma, seguindo a mesma lógica, seria isso:

    (diferença entre inner join e left join, resguardadas as diferenças de regras de negócio)

    create view MarcaProdutos as (
        select prod.descricao as Produto, mar.descricao as Marca from TAB_Produtos prod
        left join TAB_ProdutosMarcas mar on prod.CodProdutosMarcas = mar.Cod
        )

    Se faço:

    select produto from MarcaProdutos

    plano de execução não lê a PK da tabela TAB_Marcas

    Se faço:

    select produto, marca from MarcaProdutos

    Dai o plano altera para ler a PK da tabela TAB_Marcas

    O comportamento do mecanismo para pegar o plano de execução realmente é este?

    Seria interessante fazer as views com o LEFT, no sentido de serem reutilizaveis para diversas situações, e ganhar em performance, quando o campo não for utilizado?


    Julio C.

    quarta-feira, 21 de outubro de 2020 20:38
  • Julio,

    Até pode ser, mas uma alternativa que você poderia pensar seria em forçar o uso do índice.

    Com esta definida a estrutura de índices desta tabela de Produtos?

    Ela possui algum índice NonClustered?


    Pedro Antonio Galvão Junior [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]

    sábado, 24 de outubro de 2020 20:08