Conditions associées aux statistiques de distribution pour les fournisseurs OLE DB

Pour améliorer l'optimisation des requêtes distribuées, SQL Server définit des extensions à la spécification OLE DB que les fournisseurs OLE DB peuvent employer pour communiquer les statistiques de distribution sur les ensembles de lignes, ou tables, qu'ils exposent. Bien que ces extensions soient définies dans la documentation de SQL Server, les développeurs de fournisseurs OLE DB individuels doivent coder la prise en charge des extensions dans leurs fournisseurs s'ils souhaitent que ces informations soient accessibles à SQL Server. Si le code d'un fournisseur prend en charge les extensions, SQL Server peut les utiliser pour optimiser les performances des requêtes distribuées. Dans le cas contraire, SQL Server utilise de simples évaluations des statistiques de distribution.

[!REMARQUE]

Le fournisseur OLE DB Native Client pour MicrosoftSQL Server et le fournisseur Microsoft OLE DB pour Oracle prennent tous deux en charge les statistiques de distribution.

Les extensions de statistiques de distribution sont construites autour d'une unité qualifiée de statistique. Chaque table peut avoir aucune ou plusieurs statistiques, et chaque statistique communique des données pour une ou plusieurs colonnes. Une statistique enregistre les éléments suivants :

  • La cardinalité des valeurs, ou le nombre de valeurs uniques, dans chaque colonne individuelle couverte par la statistique.

  • La cardinalité des valeurs concaténées de toutes les colonnes couvertes par la statistique.

  • Facultativement, un histogramme fournissant des informations sur les diverses plages de valeurs de clé dans la première colonne couverte par la statistique. Les valeurs communiquées peuvent inclure le nombre de lignes dans chaque plage de clés, le nombre de valeurs uniques dans chaque plage de clés, ou le nombre de lignes dans la table dont les valeurs de clé sont égales ou inférieures à la valeur de clé la plus élevée dans la plage.

Voici un exemple de table :

ColumnA

ColumnB

'abc'

'xyz'

'abc'

'xyz'

'def'

'xyz'

'mno'

'xyz'

'mno'

'mmm'

'tuv'

'xyz'

Pour une statistique couvrant ColumnA et ColumnB, la cardinalité des valeurs combinées des deux colonnes est 5. Ce qui signifie qu'il existe 5 combinaisons uniques de valeurs pour ColumnA et ColumnB puisque les deux premières lignes ont la même valeur combinée ('abc' + 'xyz').

La cardinalité de ColumnA est 4 et celle de ColumnB est 2. Un histogramme simple à 4 étapes sur ColumnA indiquerait :

Plage de valeurs

Pourcentage des lignes de la table dans la plage de valeurs

'aaa' à 'hzz'

50%

'iaa' à 'nzz'

33%

'oaa' à 'rzz'

00%

'taa' à 'zzz'

17%

Différentes sources de données OLE DB enregistrent des statistiques de distribution sur différentes combinaisons de colonnes, et l'ensemble des statistiques communiquées par un fournisseur OLE DB est défini dans la mise en œuvre. Par exemple, les versions 6.5 et antérieures de SQL Server construisent des statistiques de distribution uniquement pour les colonnes couvertes par les index et disposent d'une statistique pour chaque index défini sur une table. Les versions 7.0 et ultérieures de SQL Server construisent les statistiques suivantes :

  • Une statistique pour chaque index défini sur une table.

  • Une statistique pour chaque instruction CREATE STATISTIC.

  • Une statistique pour chaque statistique générée automatiquement.

Une colonne a un niveau élevé de sélectivité si elle est susceptible de renvoyer un petit nombre de lignes pour une valeur donnée spécifiée dans un argument de prédicat. Les statistiques de distribution peuvent être utilisées pour évaluer le degré de sélectivité :

  • Les colonnes présentant une cardinalité élevée ont plus de valeurs de données, et chaque valeur de données est susceptible de correspondre à un plus petit nombre de lignes qu'une colonne présentant une faible cardinalité.

  • Si un fournisseur OLE DB fournit un histogramme indiquant la façon de distribuer les valeurs dans une colonne, l'optimiseur SQL Server peut également déterminer si la valeur spécifique d'un argument de prédicat se trouve dans une plage présentant une bonne ou une mauvaise sélectivité.

Le fait de disposer de bonnes statistiques de distribution pour un serveur lié peut également aider l'optimiseur à construire un plan d'exécution efficace pour la partie locale d'une requête distribuée.

L'optimiseur SQL Server utilise les statistiques de distribution pour essayer de réduire la quantité de données à communiquer entre le fournisseur OLE DB et SQL Server. Par exemple, lors de l'exécution d'une jointure distribuée entre TableA sur le serveur local et TableB sur un serveur lié, SQL Server peut employer les statistiques de distribution pour déterminer le processus le plus efficace :

  • Envoi des lignes de TableA correspondant aux prédicats non joints vers le serveur lié et exécution de la jointure sur le serveur lié

  • Extraction des lignes de TableB correspondant aux prédicats non joints du serveur local et exécution de la jointure sur le serveur local

Si un fournisseur OLE DB ne fournit pas d'informations de cardinalité sur une colonne, l'optimiseur SQL Server en conclut une faible cardinalité. Si le fournisseur ne communique pas d'histogramme de distribution pour une statistique, l'optimiseur fonctionne comme si les valeurs étaient uniformément réparties dans les lignes de la table.

SQL Server emploie les extensions suivantes des fournisseurs OLE DB pour communiquer les statistiques de distribution :

  • Une nouvelle propriété de source de données, DBPROP_TABLESTATISTICS, indique si le fournisseur communique les statistiques de distribution.

  • Une interface IDBSchemaRowset, TABLE_STATISTICS, répertorie les statistiques disponibles pour une table de base particulière. Il s'agit notamment de la cardinalité des colonnes et des lignes.

  • IOpenRowset::OpenRowset accepte les arguments identifiant une statistique. Lors de la spécification d'une statistique, OpenRowset renvoie un ensemble de lignes d'histogramme indiquant la distribution des valeurs dans la première colonne couverte par la statistique spécifiée dans StatisticID.

Ces extensions vers OLE DB sont incluses dans OLE DB version 2.6 ou ultérieures. Pour plus d'informations sur les extensions des statistiques de distribution, consultez la spécification OLE DB 2.6.

Un fournisseur OLE DB peut choisir de mettre en œuvre une amélioration des performances en échantillonnant uniquement une partie des lignes d'une table de base afin de déterminer les statistiques de distribution et les histogrammes. Ces fournisseurs doivent dimensionner leurs données de cardinalité et d'histogramme en fonction des valeurs totales de la table avant de les communiquer dans les ensembles de lignes TABLE_STATISTICS et des histogrammes.

C'est lors de la mise en œuvre que se décide la mise à jour éventuelle par le fournisseur OLE DB des données de l'ensemble de lignes de TABLE_STATISTICS et de l'histogramme en fonction du contenu actuel de la table de base.

[!REMARQUE]

Pour créer les meilleurs plans de requête lorsque vous utilisez une table sur un serveur lié, le processeur de requêtes doit posséder des statistiques de distribution de données du serveur lié. Les utilisateurs avec des autorisations limitées sur les colonnes de la table peuvent ne pas disposer des autorisations suffisantes pour obtenir toutes les statistiques utiles. Ils peuvent de surcroît recevoir un plan de requête moins efficace et bénéficier de performances médiocres. Si le serveur lié est une instance de SQL Server, pour obtenir toutes les statistiques disponibles, l'utilisateur doit posséder la table ou être membre du rôle serveur fixe sysadmin, du rôle de base de données fixe db_owner ou du rôle de base de données fixe db_ddladmin sur le serveur lié.