DB2 classe-t-il les données par clé primaire

8

J'ai récemment eu une discussion avec un collègue qui tentait de supprimer les clauses order by d'une requête de production, car la colonne order by était la même que la clé primaire .

Après une longue discussion au cours de laquelle j'ai essayé d'expliquer qu'il ne pouvait pas garantir un ordre basé sur la clé primaire, la conclusion finale était qu'il n'allait pas pousser pour que les requêtes MSSQL soient modifiées.
Mais il allait toujours modifier les requêtes DB2.

Je n'ai pas pu trouver immédiatement un article réfutant le fait que DB2 commande les requêtes par la clé primaire, et je me demande actuellement si oui ou non.

Ma question est donc de savoir comment DB2 ordonne une requête s'il n'y a pas de clause order by? Utilise-t-il la clé primaire?
Comment pouvez-vous garantir que les données soient correctement commandées, sans clause de tri, dans un système parallèle?

Reaces
la source

Réponses:

18

Non, votre collègue a tort.

Tous les proroduits SQL - SGBD qui se comportent conformément aux normes SQL - ne garantissent pas que le résultat d'une sortie de requête sera ordonné de quelque manière que ce soitORDER BY , sauf s'il existe une clause dans la requête .

Comme le mentionnent les documents IBM DB2 :

La commande est effectuée conformément aux règles de comparaison décrites dans Éléments de langage. La valeur nulle est supérieure à toutes les autres valeurs. Si votre spécification de commande ne détermine pas une commande complète, les lignes avec des valeurs en double de la dernière clé de tri identifiée ont un ordre arbitraire. Si vous ne spécifiez pas ORDER BY, les lignes de la table de résultats ont un ordre arbitraire.

ypercubeᵀᴹ
la source
"S'ils se comportent selon les normes SQL" est un gros si ... IBM docs FTW.
WernerCD
@WernerCD Aucun SGBD n'est conforme à 100% à la norme (et il en existe de nombreuses versions.) Mais ils prétendent se conformer à de nombreuses parties. Je m'attends à avoir au moins où ils diffèrent, documenté.
ypercubeᵀᴹ
Oui, c'est pourquoi j'étais +1 pour les documents IBM sur "Standards". "Expected" vs "Actual" peut, et certainement, vous mordre dans le keister.
WernerCD
11

Comme cela a été souligné dans la réponse de ypercube, lorsqu'il n'y a pas de ORDER BYclause, il n'y a pas d'ordre défini .

Ce que je voudrais ajouter, c'est qu'il est important de réaliser que SQL est vraiment une abstraction, il ne spécifie pas étape par étape ce que doit faire le SGBD mais spécifie plutôt vos exigences du résultat final.

Cela implique que si les données sont déjà recherchées de manière à garantir le bon ordre, c'est parce que le SGBD a décidé d'une telle stratégie et il saura alors déjà qu'aucun travail de tri supplémentaire n'est nécessaire pour répondre aux exigences de la ORDER BYclause. .

D'un autre côté, si vous ne spécifiez pas que la commande est importante pour vous (même si elle l'est réellement?), Le SGBD en tiendra compte et s'il trouve une stratégie différente plus efficace pour trouver les bonnes données dans une autre commande, elle profitera du fait que vous ne vous êtes apparemment pas soucié de la commande. (La stratégie choisie pourrait également très bien changer au fil du temps, en fonction de l'augmentation de la quantité de données dans les tableaux pertinents, les correctifs logiciels, etc.)

C'est-à-dire que la suppression de la ORDER BYclause a très peu d'avantages (taille de requête légèrement plus petite) mais potentiellement d'énormes inconvénients si la commande est réellement importante. Surtout, car cela pourrait très bien fonctionner avec l'ensemble de données de test et passer les tests d'acceptation uniquement pour causer de graves problèmes sur toute la ligne.

Håkan Lindqvist
la source
1
La raison qu'il a donnée sur sa feuille de déploiement est que "Commander par consomme des ressources CPU, alors que la commande est déjà impliquée par la clé primaire". Ce qui me paraissait très mal (comme en
témoignent
@Reaces DB2 utilise-t-il des tables «par tas» par défaut ou ressemble-t-il davantage à SQL Server avec des index clusterisés? Cela ne change pas la réponse, mais cela peut être plus facile à prouver :)
Jack dit essayer topanswers.xyz
@Jack Douglas, le clustering dans SQL Server et DB2 sont des concepts différents. J'ai beaucoup appris sur le clustering dans SQL Server dans ce fil: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Si vous connaissez SQL Server mais pas DB2, vous voudrez peut-être y jeter un œil.
Lennart
Les tables @Reaces dans DB2 sont généralement "clusterisées" sur la clé primaire par défaut, sauf si un index de clustering est spécifié.
Chris Aldrich
1
@ChrisAldrich - cette déclaration n'est vraie que pour DB2 sous z / OS.
mustaccio