Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi cette instruction Sql (avec 2 jointures de table) prend-elle 5 minutes ?

Ce n'est pas bien.

J'ai deux possibilités :

1) Les statistiques sont obsolètes sur les tableaux. Reconstruire les index et mettre à jour les statistiques.

2) Comme vous l'avez dit, les enregistrements de table de géographie sont volumineux et s'étendent sur de nombreuses pages (pas cet enregistrement sur plusieurs pages car il ne le peut pas, mais l'enregistrement est proche de la marque 8K). Dans ce cas, assez amusant, la création d'un autre index non clusterisé sur l'index clusterisé peut aider.

MISE À JOUR

Je suis content que cela ait fonctionné. Maintenant quelques explications.

Tout d'abord, si quelque chose ne va pas vraiment et que le plan d'exécution semble bizarre, examinez toujours les statistiques et reconstruisez les index.

La création d'un index non clusterisé pour l'index clusterisé ne devrait généralement offrir aucun avantage, mais lorsque la table contient de nombreux enregistrements et que l'enregistrement est proche de sa limite de 8 Ko, cela est utile. Comme vous le savez, SQL lorsqu'il va sur le disque pour charger un enregistrement, il charge une page de 8K. De la même manière, en allant aux index, il chargera une page 8K. Maintenant, avec l'index étant un entier de 4 octets, cela signifie charger l'ID pour 2000 enregistrements alors qu'il va charger une poignée d'enregistrements s'il utilise l'index clusterisé (gardez à l'esprit que tout ce dont nous avons besoin est l'ID pour le bit JOIN). Maintenant qu'il s'agit d'une recherche binaire, je ne m'attends pas à ce qu'elle aide énormément seulement un peu. Alors peut-être quelque chose d'autre n'est pas tout à fait correct, mais difficile à deviner sans avoir vu le système.