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 BY
clá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?
Respostas:
Da Wikipedia :
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 BY
cláusula, se a ordem for importante.fonte
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.
fonte