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 / 184149
Accepted
Vlad Mihalcea
Vlad Mihalcea
Asked: 2017-08-24 01:11:22 +0800 CST2017-08-24 01:11:22 +0800 CST 2017-08-24 01:11:22 +0800 CST

É REALMENTE possível que o pedido não seja garantido para esta tabela derivada redundante específica?

  • 772

Me deparei com essa pergunta em uma conversa no Twitter com Lukas Eder .

Embora o comportamento correto seja aplicar a cláusula ORDER BY na consulta mais externa, porque, aqui, não estamos usando DISTINCT, GROUP BY, JOIN ou qualquer outra cláusula WHERE na consulta mais externa, por que um RDBMS não passaria apenas a dados de entrada como foram classificados pela consulta interna?

SELECT * 
FROM (
    SELECT * FROM table ORDER BY time DESC
) AS t

Ao executar este exemplo no PostgreSQL, pelo menos, você obtém o mesmo Plano de Execução para a consulta interna e este exemplo de tabela derivada, bem como o mesmo conjunto de resultados.

Então, eu diria que o Planner simplesmente descartará a consulta mais externa porque é redundante ou simplesmente passará pelos resultados da tabela interna.

Alguém acha que pode não ser assim?

mysql postgresql
  • 4 4 respostas
  • 4456 Views

4 respostas

  • Voted
  1. Best Answer
    Lukas Eder
    2017-08-24T04:09:10+08:002017-08-24T04:09:10+08:00

    A maioria dos bancos de dados é bastante clara sobre o fato de que uma ORDER BYem uma subconsulta é:

    • Não permitido: Por exemplo, SQL Server, Sybase SQL Anywhere (a menos que complementado com TOPou OFFSET .. FETCH)
    • Sem sentido: Por exemplo, PostgreSQL, DB2 (novamente, a menos que complementado com OFFSET .. FETCHou LIMIT)

    Aqui está um exemplo do manual do DB2 LUW (ênfase minha)

    Uma cláusula ORDER BY em uma subseleção não afeta a ordem das linhas retornadas por uma consulta. Uma cláusula ORDER BY afeta apenas a ordem das linhas retornadas se for especificada na seleção completa mais externa.

    O texto é bastante explícito, assim como o do PostgreSQL :

    Se a classificação não for escolhida, as linhas serão retornadas em uma ordem não especificada. A ordem real nesse caso dependerá dos tipos de plano de varredura e junção e da ordem no disco, mas não deve ser confiável . Uma ordenação de saída específica só pode ser garantida se a etapa de classificação for escolhida explicitamente.

    A partir desta especificação, pode-se concluir que qualquer ordenação resultante da ORDER BYcláusula em uma tabela derivada é meramente acidental e pode coincidir com sua ordenação esperada (o que ocorre na maioria dos bancos de dados em seu exemplo trivial), mas seria imprudente confiar em isto.

    Nota lateral no DB2:

    Em particular, o DB2 possui um recurso menos conhecido chamadoORDER BY ORDER OF <table-designator> , que pode ser usado da seguinte forma:

    SELECT C1 FROM
       (SELECT C1 FROM T1
          UNION
        SELECT C1 FROM T2
        ORDER BY C1 ) AS UTABLE
    ORDER BY ORDER OF UTABLE
    

    Neste caso particular, a ordenação da tabela derivada pode ser reutilizada explicitamente no SELECT mais externo

    Nota lateral sobre o Oracle:

    Durante anos, tem sido uma prática na Oracle implementar a OFFSETpaginação usando ROWNUM, que pode ser razoavelmente calculado apenas após ordenar uma tabela derivada:

    SELECT *
    FROM (
      SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
      FROM (
        SELECT * FROM table ORDER BY time DESC
      ) t
    ) t
    WHERE rn BETWEEN 10 AND 20
    

    Pode-se razoavelmente esperar que, pelo menos na presença de ROWNUMuma consulta, as versões futuras do Oracle não quebrem esse comportamento para não quebrar praticamente todo o Oracle SQL legado por aí, que ainda não migrou para o muito mais desejável e sintaxe padrão SQL legível OFFSET .. FETCH:

    SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
    
    • 20
  2. David Spillett
    2017-08-24T01:47:49+08:002017-08-24T01:47:49+08:00

    Sim. Sem uma ORDER BYcláusula, a ordem de saída é indefinida e o planejador de consulta está dentro de sua competência para assumir que você sabe e entende isso.

    Ele pode decidir que, como a consulta externa não especifica uma ordem, pode descartar a ordenação na consulta interna para evitar uma operação de classificação, especialmente se não houver nenhum índice clusterizado ou nenhum índice para dar suporte à ordenação. Se isso não acontecer agora , pode acontecer em versões futuras.

    Nunca confie em comportamento indefinido. Se você precisar de um pedido específico, coloque uma ORDER BYcláusula no local apropriado.

    • 12
  3. PaulJWilliams
    2017-08-24T01:58:10+08:002017-08-24T01:58:10+08:00

    É o problema com comportamento indefinido - funciona para você, funciona para mim, reformata o HDD em prod;)

    Podemos dar um passo para trás e dizer que, em certo sentido, você está certo - não há nenhuma razão terrena para que qualquer RDBMS sensato reorganize as linhas na seleção interna. Mas não é garantido - o que significa que pode haver uma razão no futuro, e os fornecedores são livres para fazê-lo. O que significa que qualquer código que dependa desse comportamento está à mercê de uma alteração que um fornecedor poderia fazer e que não teria a obrigação de divulgar, pois não é uma alteração importante de um POV de API.

    • 6
  4. Erwin Brandstetter
    2017-09-14T06:05:00+08:002017-09-14T06:05:00+08:00

    É REALMENTE possível que o pedido não seja garantido para esta tabela derivada redundante específica?

    A resposta para todas as versões atuais do Postgres (que você estava testando) é: Não . Para a consulta fornecida, a ordem de classificação é garantida.

    As pessoas do SQL Server ficarão desconfortáveis ​​com isso, pois a Microsoft nem permite ORDER BYsubconsultas. A ordem de classificação é garantida para essa consulta simples no Postgres. ORDER BYé aplicado na subconsulta e a consulta externa não faz nada que possa alterar a ordem.

    O manual ainda sugere isso no capítulo Funções Agregadas :

    Como alternativa, fornecer os valores de entrada de uma subconsulta classificada geralmente funcionará.

    Observe que isso só é verdade enquanto os níveis de consulta externos não adicionam operações que podem alterar a ordem. Portanto, é apenas "garantido" para o caso simples, e isso não é apoiado pelo padrão SQL. O Postgres é livre para reordenar se for oportuno para operações adicionais. Em caso de dúvida adicione outro ORDER BYao exterior SELECT. (Nesse caso, o ORDER BYruído interno seria redundante para essa consulta simples.)

    • 3

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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