O DB2 solicita dados pela chave primária

8

Recentemente, tive uma discussão com um colega que estava pressionando para remover as cláusulas de ordem por uma consulta de produção, porque a ordem por coluna era igual à chave primária .

Após uma longa discussão em que tentei explicar que ele não pode garantir pedidos com base na chave primária, a conclusão final foi que ele não pressionaria para que as consultas do MSSQL fossem alteradas.
Mas ele ainda iria alterar as consultas do DB2.

Não pude encontrar imediatamente um artigo que refutasse que o DB2 solicitasse consultas pela chave primária e, no momento, estou me perguntando se o faz.

Portanto, minha pergunta é: como o DB2 solicita uma consulta se não houver uma cláusula order by? Ele usa a chave primária?
Como garantir que os dados sejam enviados corretamente, sem uma cláusula order by, em um sistema paralelo?

Reaces
fonte

Respostas:

18

Não, seu colega está errado.

Todos os produtos SQL - DBMS que se comportam de acordo com os padrões SQL - não garantem que o resultado de uma saída de consulta seja ordenado de qualquer forma, a menos que haja uma ORDER BYcláusula na consulta .

Como os documentos do IBM DB2 mencionam :

O pedido é realizado de acordo com as regras de comparação descritas em Elementos do idioma. O valor nulo é maior que todos os outros valores. Se sua especificação de pedido não determinar uma ordem completa, as linhas com valores duplicados da última chave de classificação identificada terão uma ordem arbitrária. Se você não especificar ORDER BY, as linhas da tabela de resultados terão uma ordem arbitrária.

ypercubeᵀᴹ
fonte
"Se eles se comportarem segundo os padrões SQL" é muito importante se ... A IBM documenta o FTW.
WernerCD
@WernerCD Nenhum DBMS cumpre 100% do padrão (e existem muitas versões dele). Mas eles afirmam estar em conformidade com muitas partes. Espero pelo menos ter onde eles diferem, documentado.
ypercubeᵀᴹ
Sim, é por isso que fui +1 nos documentos da IBM sobre "Padrões". "Expected" vs "Actual" pode, e definitivamente será, mordê-lo no keister.
WernerCD
11

Como foi apontado na resposta do ypercube, quando não há ORDER BYcláusula, não há ordem definida .

O que eu gostaria de acrescentar é que é importante perceber que o SQL é uma abstração, não especifica passo a passo o que o DBMS deve fazer, mas especifica seus requisitos do resultado final.

Isso implica que, se os dados já forem pesquisados ​​de maneira a garantir a ordem correta, é porque o DBMS decidiu por essa estratégia e já saberá que não é necessário nenhum trabalho de classificação adicional para atender aos requisitos da ORDER BYcláusula .

Por outro lado, se você não especificar que o pedido é significativo para você (mesmo que seja realmente?), O DBMS levará isso em consideração e se encontrar uma estratégia diferente que seja mais eficiente para encontrar os dados corretos em em algum outro pedido, ele aproveitará o fato de que você aparentemente não se importou com o pedido. (A estratégia escolhida também pode mudar com o tempo, com base no aumento da quantidade de dados nas tabelas relevantes, patches de software etc.)

Ou seja, remover a ORDER BYcláusula tem muito pouca vantagem (tamanho da consulta um pouco menor), mas potencialmente enorme desvantagem se o pedido for realmente importante. Especialmente, pois isso poderia muito bem funcionar com o conjunto de dados de teste e passar pelo teste de aceitação apenas para causar sérios problemas na linha.

Håkan Lindqvist
fonte
11
O motivo que ele deu em sua planilha de implantação é que "Fazer o pedido está consumindo recursos da CPU, enquanto o pedido já está implícito pela chave primária". Que parecia muito errado para mim (como comprovado pelas respostas até agora)
Reaces
@Reaces O DB2 usa tabelas 'heap' por padrão ou é mais como o SQL Server com índices em cluster? Isso não altera a resposta, mas pode facilitar a prova :)
diz Jack, tente topanswers.xyz
@ Jack Douglas, clustering no SQL Server e DB2 são conceitos diferentes. Aprendi muito sobre clustering no servidor SQL neste segmento: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Se você conhece o servidor SQL, mas não o DB2, pode querer dar uma olhada.
Lennart
As tabelas @Reaces no DB2 geralmente são "agrupadas" na chave primária por padrão, a menos que um índice de agrupamento seja especificado.
Chris Aldrich
11
@ChrisAldrich - esta declaração é verdadeira apenas para o DB2 no z / OS.
mustaccio