I compreender que você não pode ter ORDER BY
em uma exibição. (Pelo menos no SQL Server 2012, estou trabalhando com)
Também entendo que a maneira "correta" de classificar uma exibição é colocando uma declaração ORDER BY
ao redor da SELECT
consulta.
Mas, sendo relativamente novo no SQL prático e no uso de visualizações, gostaria de entender por que isso é feito por design. Se eu segui o histórico corretamente, isso já foi possível e foi explicitamente removido do SQL Server 2008 e assim por diante (não me cite na versão exata).
No entanto, o melhor motivo pelo qual a Microsoft removeu esse recurso é porque "uma exibição é uma coleção de dados não classificada".
Suponho que exista uma boa razão lógica para o motivo de uma Visualização não ser classificada. Por que uma visão não pode ser apenas uma coleção achatada de dados? Por que especificamente não classificado? Não parece difícil chegar a situações em que (pelo menos para mim / IMHO) parece perfeitamente intuitivo ter uma visão ordenada.
fonte
Respostas:
(Visões indexadas à parte, é claro.)
Uma visualização não é materializada - os dados não são armazenados; então, como eles podem ser classificados? Uma visualização é como um procedimento armazenado que contém apenas um
SELECT
sem parâmetros ... ele não contém dados, apenas a definição da consulta. Como referências diferentes à exibição podem precisar de dados classificados de maneiras diferentes, a maneira como você faz isso - assim como selecionar em uma tabela, que também é uma coleção não classificada de linhas, por definição - é incluir a ordem na consulta externa .Também para dar uma pequena visão da história. Você nunca poderia colocar
ORDER BY
uma visão, sem incluir tambémTOP
. E, neste caso, oORDER BY
ditado por quais linhas foram incluídasTOP
, não como elas seriam apresentadas. Aconteceu que no SQL Server 2000, seTOP
era100 PERCENT
ou{some number >= number of rows in the table}
, o otimizador era bastante simplista e acabou produzindo um plano com uma classificação que correspondia àTOP/ORDER BY
. Mas esse comportamento nunca foi garantido ou documentado - apenas se baseava na observação, o que é um mau hábito . Quando o SQL Server 2005 foi lançado, esse comportamento começou a "quebrar" devido a alterações no otimizador que levaram a diferentes planos e operadores sendo usados - entre outras coisas, oTOP / ORDER BY
seria completamente ignorado se fosseTOP 100 PERCENT
. Alguns clientes reclamaram disso tão alto que a Microsoft emitiu um sinalizador de rastreamento para restabelecer o comportamento antigo. Não vou lhe dizer qual é o sinalizador porque não quero que você o use e quero ter certeza de que a intenção está correta - se você deseja uma ordem de classificação previsível, useORDER BY
na consulta externa.Para resumir e esclarecer o que você fez: a Microsoft não removeu nada. Eles tornaram o produto melhor e, como efeito colateral, esse comportamento não documentado e não garantido se tornou menos confiável. No geral, acho que o produto é melhor para ele.
fonte
TOP
executa uma operação de cursor sobre o conjunto de resultados. Por isso, pode ter uma ordem explícita.TOP 100 PERCENT / ORDER BY
e o remove completamente do plano. Experimente.Se uma visualização foi autorizada a ser classificada, qual deve ser a ordem do resultado aqui?
fonte
uma possibilidade é evitar classificações conflitantes - se a visualização for classificada por um pedido e a seleção nessa visualização estiver classificada por outra ordem (sem estar ciente da classificação), poderá ocorrer um impacto no desempenho. Portanto, é mais seguro deixar o requisito de classificação para o usuário.
Por outro motivo, a classificação vem com um custo de desempenho. Por que penalizar todos os usuários da visualização, quando apenas alguns usuários precisam da classificação?
fonte
O ANSI SQL permite apenas a
ORDER BY
consulta externa por uma variedade de razões, sendo uma delas o que acontece quando uma subseleção / view / CTE é associada a outra tabela e a consulta externa possui umaORDER BY
própria.O servidor SQL nunca o suportava em uma exibição (a menos que você o enganasse usando um
TOP 100 PERCENT
que, na minha opinião, está principalmente provocando um bug).Mesmo que você tenha acionado o bug, os resultados nunca foram confiáveis e a classificação nem sempre foi da maneira esperada.
Consulte esta postagem no blog da equipe do Query Optimizer para obter uma explicação técnica completa. TOP 100% ORDEM POR CONSIDERADO PREJUDICIAL.
fonte
As visualizações se comportam como tabelas cujo conteúdo é determinado pelos resultados de uma consulta.
As mesas não têm ordem; são apenas sacos de linhas.
Portanto, as visualizações também não têm ordem. Você pode classificá-los selecionando linhas em uma ORDER específica, no entanto.
fonte
Uma resposta ainda não dada é que "ordenar por" pode interferir no envio de predicados, o que pode afetar muito o desempenho.
Um exemplo é ter uma exibição que agrupa um grande conjunto de dados em um resumo de 10 linhas que é o top 10 / Ordenado:
Para o mesmo caso com um predicado forte:
Ainda leva a mesma quantidade de tempo, porque a ordem de cima está impedindo que o predicado seja executado mais cedo no pipeline. Isso pode fazer com que as linhas desnecessárias sejam processadas e o plano será semelhante ao sem predicado.
Se o envio deve ocorrer antes do pedido é realmente uma escolha do desenvolvedor e pode alterar a resposta. Na maioria das vezes, o impulso é a intenção lógica.
O uso dos "100% principais" permite logicamente o envio de predicados, no entanto, infelizmente, a implementação ignora a ordem de "nesse caso" e derrota a intenção.
Para casos de uso reais, um bom compromisso seria o mecanismo executar "ordem puxando". Isso permitiria que um "pedido por" fosse especificado na exibição (com 100% ou mais top) e essa ordem será usada apenas se a exibição for selecionada diretamente, sem uma ordem explícita de, sem junções, sem agregados, sem ambos os casos listados acima podem ser suportados por este modelo simples.
fonte
você pode criar uma exibição que tenha ordem e preserve a ordem quando consultada após:
selecione os principais 99,999999999999 por cento * de ..... ordenar por
fonte
SELECT TOP 100 PERCENT ...
?