Faz diferença se você filtrar uma visualização dentro ou fora da visualização?
Por exemplo, existe alguma diferença entre essas duas consultas?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Ou
SELECT Id
FROM MyView
WHERE SomeColumn = 1
E MyView
é definido como
SELECT Id, SomeColumn
FROM MyTable
E a resposta é diferente se a tabela de origem estiver localizada em um servidor vinculado?
Estou perguntando porque tenho que consultar uma tabela grande (linhas de 44mil) duas vezes em um servidor vinculado e obter um agregado dos resultados. Quero saber se devo criar duas visualizações para acessar os dados, uma para cada consulta, ou se posso me safar com uma única visualização e uma WHERE
cláusula.
UNION ALL
. É muito mais fácil usar uma Visualização do que ter que reescrever a consulta UNION sempre que eu precisar dos dados.Respostas:
Você não verá absolutamente nenhuma diferença nos planos ou no desempenho entre essas duas opções. Quando a visualização é consultada, ela é expandida para uma consulta na tabela base, o que significa que a mesma busca ou verificação será usada.
Agora, dependendo do tipo de dados e da seletividade
MyColumn
, se você deseja criar um índice filtrado na tabela base (quando você muda para o SQL Server 2008+), poderá obter um melhor desempenho, mas isso novamente não será diferente na exibição ou sem.fonte
where
cláusula fora da visualização leva muito mais tempo do que quando é colocada na visualização?Aqui está apenas um exemplo rápido, mostrando que não deve haver diferença. O banco de dados é o
AdventureWorks
banco de dados.Duas definições de visualização:
Aqui seria a primeira consulta, com o
WHERE
cláusula incluída na definição de exibição:Aqui está o plano de execução:
E a segunda consulta, com a
WHERE
cláusula não na definição da visualização, mas naSELECT
consulta:Aqui está esse plano de execução:
Como você pode ver nesses planos de execução, eles são idênticos com resultados idênticos. Não conheço uma situação em que esse tipo de lógica / design produza resultados diferentes. Então, eu gostaria de dizer que você está seguro de qualquer maneira e seguir com preferência pessoal (ou procedimentos de compras).
fonte
where
cláusula fora da visualização leva muito mais tempo do que quando é colocada na visualização?Where
cláusula se encaixa noPARTITION BY
. O SQL Server 2008 parece ter uma nova regraSelOnSeqPrj
para reconhecer esse caso específico.Com base no que estou lendo , o SQL usará uma exibição padrão como uma subconsulta ao determinar o plano de execução.
Então, usando minha consulta de exemplo,
onde
MyView
é definido comodeve gerar o mesmo plano de execução que
mas esse plano de execução pode ser diferente do que seria gerado com
Não tenho certeza se essa resposta seria a mesma para exibições indexadas
fonte
sp_refreshview
é necessário o que o conceito de substituição de texto não faria.