AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 21434
Accepted
ngmiceli
ngmiceli
Asked: 2012-07-25 12:28:59 +0800 CST2012-07-25 12:28:59 +0800 CST 2012-07-25 12:28:59 +0800 CST

Por que ORDER BY não pertence a uma View?

  • 772

Eu entendo que você não pode ter ORDER BY uma visão. (Pelo menos no SQL Server 2012 com o qual estou trabalhando)

Eu também entendo que a maneira "correta" de classificar uma exibição é colocando uma instrução ORDER BYem torno da SELECTconsulta consultando a exibição.

Mas sendo relativamente novo no SQL prático e nos usos 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 a versão exata).

No entanto, a melhor razão pela qual a Microsoft removeu esse recurso é porque "uma exibição é uma coleção de dados não classificada".

Estou assumindo que há uma razão boa e lógica para que uma exibição não seja classificada. Por que uma visualização não pode ser apenas uma coleção de dados achatada? Por que especificamente não classificado? Não parece tão difícil encontrar situações em que (pelo menos para mim / IMHO) pareça perfeitamente intuitivo ter uma visão classificada.

sql-server order-by
  • 7 7 respostas
  • 57553 Views

7 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-07-25T12:34:30+08:002012-07-25T12:34:30+08:00

    (Exibições indexadas à parte, é claro.)

    Uma visão não é materializada - os dados não são armazenados, então como eles podem ser classificados? Uma visão é como um procedimento armazenado que contém apenas um SELECTsem parâmetros... ele não contém dados, apenas contém a definição da consulta. Como diferentes referências à 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 um pouco de visão sobre a história. Você nunca poderia colocar ORDER BYuma visão, sem incluir também TOP. E, neste caso, o ORDER BYditado quais linhas foram incluídas por TOP, não como elas seriam apresentadas. Aconteceu que no SQL Server 2000, se TOPera 100 PERCENTou {some number >= number of rows in the table}, o otimizador era bastante simplista e acabou produzindo um plano com uma classificação que correspondia ao TOP/ORDER BY. Mas esse comportamento nunca foi garantido ou documentado - foi apenas invocado com base na observação, o que é um mau hábito . Quando o SQL Server 2005 foi lançado, esse comportamento começou a "quebrar" por causa de mudanças no otimizador que levaram à utilização de diferentes planos e operadores - entre outras coisas, oTOP / ORDER BYseria ignorado completamente se fosse TOP 100 PERCENT. Alguns clientes reclamaram tanto disso que a Microsoft emitiu um sinalizador de rastreamento para restabelecer o comportamento antigo. Não vou 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ê quiser uma ordem de classificação previsível, use ORDER BYna consulta externa.

    Para resumir e também para esclarecer um ponto que você fez: a Microsoft não removeu nada. Eles melhoraram o produto e, como efeito colateral, esse comportamento não documentado e não garantido tornou-se menos confiável. No geral, acho que o produto é melhor para isso.

    • 40
  2. Martin Smith
    2015-11-15T06:51:26+08:002015-11-15T06:51:26+08:00

    Se uma visão pudesse ser classificada, qual deveria ser a ordem do resultado aqui?

    CREATE VIEW dbo.V1
    AS
      SELECT number
      FROM   SomeTable
      ORDER  BY number ASC
    
    GO
    
    CREATE VIEW dbo.V2
    AS
      SELECT number
      FROM   SomeTable
      ORDER  BY number DESC
    
    GO
    
    SELECT *
    FROM   dbo.V1
           JOIN dbo.V2
             ON V1.number = V2.number 
    
    • 9
  3. srini.venigalla
    2012-07-25T12:36:56+08:002012-07-25T12:36:56+08:00

    uma possibilidade é evitar classificações conflitantes - se a exibição estiver classificando por uma ordem e o select nessa exibição estiver classificando por outra ordem (sem estar ciente da classificação da exibição), pode haver um impacto no desempenho. Portanto, é mais seguro deixar o requisito de classificação para o usuário.

    outro motivo, a classificação vem com um custo de desempenho, então por que penalizar todos os usuários da visualização, quando apenas alguns usuários precisam da classificação?

    • 8
  4. Tom V
    2015-11-15T09:18:41+08:002015-11-15T09:18:41+08:00

    O ANSI SQL permite apenas a ORDER BYconsulta externa por vários motivos, sendo um deles o que acontece quando uma subseleção/exibição/CTE é associada a outra tabela e a consulta externa possui uma ORDER BYprópria.

    O servidor SQL nunca o suportou dentro de uma visão (a menos que você o tenha enganado usando um TOP 100 PERCENTque, na minha opinião, está acionando principalmente um bug).

    Mesmo que você tenha acionado o bug, os resultados nunca foram confiáveis ​​e a classificação nem sempre saiu da maneira que você esperava.

    Consulte esta postagem de blog da equipe do Otimizador de consultas para obter uma explicação técnica completa TOP 100% ORDER BY Considerado prejudicial.

    A implementação do plano padrão para este código acontece para classificar as linhas como parte da execução da operação TOP. Muitas vezes, isso significava que os resultados eram retornados em ordem classificada, e isso levava os clientes a acreditar que havia uma garantia de que as linhas eram classificadas. Este não é realmente o caso. Se você quiser que as linhas sejam retornadas ao usuário em ordem de classificação, você precisa usar um ORDER BY no bloco de consulta mais externo (por ANSI) para garantir a ordem de apresentação de saída.

    • 5
  5. user90685
    2012-07-25T12:34:19+08:002012-07-25T12:34:19+08:00

    As visualizações se comportam como tabelas cujo conteúdo é determinado pelos resultados de uma consulta.

    As tabelas não têm ordem; são apenas sacos de fileiras.

    Portanto, as visualizações também não têm ordem. No entanto, você pode classificá-los selecionando linhas em um ORDER específico.

    • 3
  6. crokusek
    2014-07-24T15:15:58+08:002014-07-24T15:15:58+08:00

    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 visualização que acumula um grande conjunto de dados em um resumo de 10 linhas que é o top 10/Pedidos:

    select * from TopOrderedView; -- Ordered 10 line summary in 5s
    

    Para o mesmo caso com um predicado forte:

    select * from TopOrderedView where <condition>; -- Ordered 2 line summary in still 5s
    

    Ainda leva o mesmo tempo porque o top/order by está bloqueando a execução do predicado mais cedo no pipeline. Isso pode fazer com que linhas desnecessárias sejam processadas e o plano será semelhante ao sem predicado.

    Se o push deve acontecer antes do pedido é realmente uma escolha do desenvolvedor e pode mudar a resposta. Na maioria das vezes, o impulso é a intenção lógica.

    O uso de "top 100 por cento" permite logicamente o envio de predicado, mas a implementação infelizmente ignora "ordem por" para este caso e anula a intenção.

    Para casos de uso reais, um bom compromisso seria o mecanismo executar "ordem puxando". Isso permitiria que uma "ordem por" fosse especificada na visualização (com 100 por cento superior ou sem parte superior) e essa ordem só seria usada se a visualização fosse selecionada diretamente, sem uma ordem explícita por, sem junções, sem agregações, sem encadeamento de visualizações etc. Ambos os casos listados acima podem ser suportados por este modelo simples.

    • -2
  7. NasF1
    2015-12-17T12:34:17+08:002015-12-17T12:34:17+08:00

    você pode criar uma visão que tenha ordem por e preserve a ordem por quando consultada após:

    selecione top 99.999999999999 por cento * de ..... peça por

    • -6

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve