S'il vous plaît expliquer le plan de requête SQL Server choisit

Dans cet article de blog , j'ai besoin de clarifier pourquoi SQL Server choisirait un type d'parsing particulier:

Supposons par simplicité que col1 soit unique et croisse en valeur, col2 a 1000 valeurs distinctes et il y a 10.000.000 lignes dans la table, et que l'index cluster est constitué de col1 et qu'un index non cluster existe sur col2.

Imaginez le plan d'exécution de requête créé pour les parameters initialement transmis suivants: @ P1 = 1 @ P2 = 99

Ces valeurs conduiraient à un plan de requête optimal pour l'instruction suivante en utilisant les parameters substitués:

Sélectionnez * à partir de t où col1> 1 ou col2

99 command par col1;

Maintenant, imaginez le plan d'exécution de la requête si les valeurs initiales des parameters étaient: @ P1 = 6 000 000 et @ P2 = 550.

Comme précédemment, un plan de requête optimal serait créé après la substitution des parameters passés:

Sélectionnez * depuis t où col1> 6000000 ou col2> 550 par col1;

Ces deux instructions SQL paramétrées identiques pourraient potentiellement créer et mettre en cache des plans d'exécution très différents en raison de la différence entre les valeurs de parameters initialement transmises. Toutefois, étant donné que SQL Server met uniquement en cache un plan d'exécution par requête, il est très probable que dans le premier cas, le plan d'exécution de la requête utilise un balayage d'index clusterisé en raison de la substitution des parameters 'col1> 1'. Considérant que, dans le second cas, un plan d'exécution de requête utilisant la search d'index serait probablement créé.

à partir de: http://blogs.msdn.com/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx

Pourquoi la première requête utiliserait-elle un index clusterisé et une search d'index dans la deuxième requête?

En supposant que les colonnes contiennent uniquement des entiers positifs:

SQL Server examine les statistics de la table et voit que, pour la première requête, toutes les lignes de la table répondent aux critères de col1> 1, de sorte qu'elle choisit d'parsingr l'index clusterisé.

Pour la deuxième requête, une proportion relativement faible de lignes répondrait aux critères de col1> 6000000, donc l'utilisation d'une search d' index améliorerait les performances.

Notez que dans les deux cas, l'index cluster sera utilisé. Dans le premier exemple, il s'agit d'un index clusterisé SCAN où, comme dans le second exemple, il s'agira d'un index clusterisé SEEK qui, dans la plupart des cas, sera le plus rapide comme l'indique l'auteur du blog.

SQL Server sait que l'index clusterisé augmente. Par conséquent, il effectuera une parsing d'index en cluster dans le premier cas.

Dans les cas où l'optimiseur voit que la majorité de la table sera returnnée dans la requête, comme la première requête, alors il est plus efficace d'effectuer un balayage qu'une search.

Lorsque seule une petite partie de la table sera renvoyée, comme dans la deuxième requête, une search d'index est plus efficace.

Une parsing touchera chaque ligne de la table, qu'elle soit qualifiée ou non. Le coût est proportionnel au nombre total de lignes dans la table. Une parsing est une stratégie efficace si la table est petite ou si la plupart des lignes sont qualifiées pour le prédicat.

Une search touchera les lignes qualifiées et les pages contenant ces lignes qualifiées, le coût est proportionnel au nombre de lignes et de pages qualifiées plutôt qu'au nombre total de lignes de la table.