Edit: +1 fonctionne dans cette situation car il s'avère qu'il FILE_NUMBER
s'agit d'une version chaîne zéro complétée d'un entier. Une meilleure solution ici pour les chaînes consiste à ajouter ''
(la chaîne vide), car l’ajout d’une valeur peut affecter l’ordre, ou que les nombres ajoutent quelque chose de constant mais qui contient une fonction non déterministe, telle que sign(rand()+1)
. L'idée de "briser le genre" est toujours valable ici, c'est juste que ma méthode n'était pas idéale.
+1
Non, je ne veux pas dire que je suis d'accord avec quoi que ce soit, je veux dire cela comme une solution. Si vous modifiez votre requête en ORDER BY cj.FILE_NUMBER + 1
alors le TOP 1
se comportera différemment.
Vous voyez, avec l'objectif de petite ligne en place pour une requête ordonnée, le système essaiera de consommer les données dans l'ordre, pour éviter d'avoir un opérateur de tri. Cela évitera également de construire une table de hachage, sachant qu'il n'aura probablement pas à travailler trop pour trouver la première ligne. Dans votre cas, cela est faux: vu l’épaisseur de ces flèches, il semble qu’il doive consommer beaucoup de données pour trouver une seule correspondance.
L'épaisseur de ces flèches suggère que votre DOCUMENT_QUEUE
table (DQ) est beaucoup plus petite que votre CORRESPONDENCE_JOURNAL
table (CJ). Et que le meilleur plan serait en réalité de vérifier toutes les lignes DQ jusqu'à ce qu'une ligne CJ soit trouvée. En fait, c’est ce que l’optimiseur de requêtes (QO) ferait s’il ne contenait pas cette embêtade ORDER BY
, c’est bien soutenu par un index couvrant sur CJ.
Donc, si vous les supprimiez ORDER BY
complètement, je suppose que vous obtiendrez un plan comportant une boucle imbriquée, qui parcourt les rangées de DQ, recherchant dans CJ pour s’assurer que la rangée existe. Et avec TOP 1
, cela s'arrêterait après qu'une seule rangée ait été tirée.
Mais si vous avez réellement besoin de la première ligne dans l' FILE_NUMBER
ordre, vous pourriez alors tromper le système en ignorant cet index qui semble (à tort) être si utile, en agissant ORDER BY CJ.FILE_NUMBER+1
- et nous savons qu'il gardera le même ordre qu'auparavant, mais surtout le QO ne le fait pas L’assurance qualité s’attachera à obtenir l’ensemble complet de manière à pouvoir satisfaire un opérateur de tri par ordre croissant. Cette méthode doit produire un plan contenant un opérateur Compute Scalar pour calculer la valeur pour la commande et un opérateur Top N Sort pour obtenir la première ligne. Mais à droite de ceux-ci, vous devriez voir une belle boucle imbriquée, faisant beaucoup de recherches sur CJ. Et de meilleures performances que de parcourir une grande table de lignes qui ne correspond à rien dans DQ.
Le hachage n'est pas forcément horrible, mais si l'ensemble des lignes que vous retournez de DQ est bien plus petit que CJ (comme je le pensais), alors le hachage analysera beaucoup plus de CJ. que ce dont il a besoin.
Remarque: j'ai utilisé +1 au lieu de +0 car l'optimiseur de requêtes est susceptible de reconnaître que +0 ne change rien. Bien sûr, la même chose pourrait s’appliquer au +1, si ce n’est maintenant, à un moment donné dans l’avenir.
DOCUMENT_ID
relation entre les deux tables (ou chaque enregistrementCORRESPONDENCE_JOURNAL
est-il associé à un enregistrement correspondantDOCUMENT_QUEUE
)?