Em que ordem as linhas são buscadas na cláusula ORDER BY ausente?


11

Um programador está testando e comparando o mesmo aplicativo que usa a mesma estrutura de banco de dados e os mesmos dados, apenas em dois bancos de dados separados, um com Oracle 8 e outro com Oracle 9.

O aplicativo executa uma consulta sem ORDER BY cláusula.

Ele afirma que a consulta ORDER-BY-less deve retornar as linhas na mesma ordem nos dois bancos de dados.

Digo a ele que não há garantia da mesma ordem de linha, a menos que você forneça explicitamente uma cláusula ORDER BY.

O banco de dados tem os mesmos índices e chaves. Mas o plano de explicação mostra que em um dos bancos de dados o mecanismo está usando a chave de uma das tabelas unidas, enquanto no outro banco de dados está usando o de outra.

Ele insinua que os dois ambientes de banco de dados não são iguais, o que ocorre porque eles têm estatísticas diferentes, diferentes mecanismos de rdbms, etc., mas não porque eu não consegui replicar todos os índices do banco de dados original.

Digo a ele que ele deve explicitamente fornecer uma ORDER BYcláusula se a ordem for realmente tão importante.

A questão

Para que eu possa explicar melhor:

Em que ordem uma consulta busca linhas quando você não fornece explicitamente uma cláusula ORDER BY e por que essa consulta não retorna as linhas na mesma ordem?


3
Está indefinido. Não acredito que a especificação SQL declare a ordem específica em que os registros devem ser retornados, portanto dependerá da implementação.
Robert Harvey

1
@RobertHarvey É exatamente por isso que digo a ele. De fato: por definições, as tabelas relacionais não devem ter uma ordem específica.
Tulains Córdova 9/08/13

1
Pode fazer sentido, mesmo na mesma versão exata do software, usar um índice diferente, pois pode ser mais seletivo com base nas estatísticas do índice coletadas para os dados exatos nesse banco de dados. Portanto, você realmente não pode confiar no pedido se não o especificar.
Psr

Você pode realisticamente esperar que a primeira consulta por coluna não indexada siga a ordem "inserir hora"; pelo "tempo de atualização" indexado. Solicitações consecutivas provavelmente podem ser "contaminadas" pelos resultados armazenados em cache e, portanto, aleatoriamente; no entanto, nunca depende disso - pode mudar de versão para versão, por parâmetros, por operações de atualização e pelo mau tempo na lua cheia. "Indefinido" é a resposta correta e qualquer outra coisa é na melhor das hipóteses informadas.
SF.

1
Os conjuntos de resultados retornados pelo RDMBS-es são apenas isso: sets , que por definição não têm uma ordem específica. Portanto, o RDBMS pode devolvê-los na ordem que desejar e alterar a ordem novamente na próxima execução da consulta. Confiar em uma ordem específica sem uma cláusula ORDER BY seria um erro. Eu sempre tento explicar isso para meus colegas de trabalho, mas só tenho sucesso na metade do tempo: D.
Radu Murzea

Respostas:


25

Da Wikipedia :

A cláusula ORDER BY identifica quais colunas são usadas para classificar os dados resultantes e em qual direção elas devem ser classificadas (as opções são ascendentes ou descendentes). Sem uma cláusula ORDER BY, a ordem das linhas retornadas por uma consulta SQL é indefinida.

Portanto, é indefinido.

A especificação SQL não indica a ordem específica em que os registros devem ser retornados, portanto, depende da implementação.

Sem índices na tabela, a ordem sensata seria a ordem na qual os registros foram inseridos. Com uma Chave Primária definida, a ordem sensata seria a ordem da Chave Primária. Mas como a especificação ANSI não exige um pedido específico, depende do fornecedor, e suas sensibilidades podem diferir da sua ou da minha.

Como o pedido não está especificado na especificação, não é aconselhável confiar no comportamento da implementação de um fornecedor específico, pois ele pode variar de um fornecedor para outro, e o fornecedor pode alterar a ordem a qualquer momento, sem aviso prévio.

Como você disse, basta incluir a ORDER BYcláusula, se a ordem for importante.


A consulta possui várias tabelas associadas. Portanto, um mecanismo de banco de dados classifica o conjunto de resultados por um critério e o outro banco de dados usa outro critério. Obviamente, quando uma cláusula ORDER BY é fornecida, as duas consultas retornam as linhas na ordem especificada.
Tulains Córdova

+1 AFAICR, o pedido pode até variar sempre que você executa uma consulta em uma instância de banco de dados específica.
precisa saber é

2
Eu diria que, sem uma cláusula ORDER BY, a única ordem de resultado sensível é o que cria o mínimo de sobrecarga. Para mecanismos e consultas simples de armazenamento de banco de dados, geralmente será a ordem de inserção (e as chaves primárias geradas são iguais à ordem das chaves primárias). Mas assim que você tiver junções de hash, espero que a ordem seja essencialmente aleatória.
Michael Borgwardt

2

Obviamente, apontar que a especificação não diz em que ordem os dados são recebidos, não funcionou. Provavelmente porque ele sabe que os dados estão em um disco ou na memória em algum lugar e, portanto, tem isso como um pedido. Pergunte a ele qual é a ordem dos dados calculados de várias tabelas. Ou seja, crie um exemplo em que você junta 4 tabelas, fazendo um cálculo em 2 delas e retornando apenas o valor calculado.

O mecanismo retorna os dados na ordem em que os encontra (na ausência de um pedido), mas como os encontra depende de fatores que podem mudar - índices, estatísticas, caches. Geralmente, os dados estão em uma ordem consistente - mas se você depender do pedido, precisará solicitá-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.