Anforderungen an die Verteilungsstatistik für OLE DB-Anbieter

Zur Verbesserung der Optimierung von verteilten Abfragen definiert SQL Server Erweiterungen für die OLE DB-Spezifikation, die von OLE DB-Anbietern zum Erstellen von Berichten für die Verteilungsstatistiken in den bereitgestellten Rowsets oder Tabellen verwendet werden können. Diese Erweiterungen sind zwar in der SQL Server-Dokumentation definiert, doch müssen Entwickler von OLE DB-Anbietern Code für die Erweiterungen in den Anbietern schreiben, wenn sie SQL Server die Informationen zur Verfügung stellen möchten. Wenn ein Anbieter über Code verfügt, der die Erweiterungen unterstützt, kann SQL Server die Erweiterungen zur Optimierung der Leistung verteilter Abfragen verwenden. Werden die Erweiterungen von einem Anbieter nicht unterstützt, verwendet SQL Server einfache Schätzwerte der Verteilungsstatistiken.

HinweisHinweis

Der MicrosoftSQL Server Native Client-OLE DB-Anbieter und der Microsoft OLE DB-Anbieter für Oracle unterstützen Verteilungsstatistiken.

Die Erweiterungen der Verteilungsstatistiken basieren auf einer Einheit, die als Statistik bezeichnet wird. Jede Tabelle kann null oder mehr Statistiken aufweisen, und jede Statistik liefert Daten für eine oder mehrere Spalten. In einer Statistik wird Folgendes aufgezeichnet:

  • Die Kardinalität der Werte oder die Anzahl der eindeutigen Werte in jeder in der Statistik erfassten Spalte.

  • Die Kardinalität der verketteten Werte aller in der Statistik erfassten Spalten.

  • Optional ein Histogramm, das Informationen zu verschiedenen Schlüsselwertbereichen in der ersten in der Statistik erfassten Spalte meldet. Die gemeldeten Werte können die Anzahl der Zeilen in den einzelnen Schlüsselbereichen, die Anzahl der eindeutigen Werte in den einzelnen Schlüsselbereichen oder die Anzahl von Zeilen in der Tabelle, deren Schlüsselwerte niedriger als oder gleich dem höchsten Schlüsselwert im Bereich sind, enthalten.

Die folgende Tabelle dient als Beispiel.

ColumnA

ColumnB

'abc'

'xyz'

'abc'

'xyz'

'def'

'xyz'

'mno'

'xyz'

'mno'

'mmm'

'tuv'

'xyz'

Bei einer Statistik mit den Spalten ColumnA und ColumnB ist die Kardinalität der kombinierten Werte beider Spalten 5. Dies bedeutet, dass es 5 einmalige Kombinationen von Werten für die Spalten ColumnA und ColumnB gibt, da die ersten beiden Zeilen denselben kombinierten Wert ('abc' + 'xyz') aufweisen.

Die Kardinalität der Spalte ColumnA allein ist 4, und die Kardinalität der Spalte ColumnB ist 2. Ein einfaches, aus vier Schritten bestehendes Histogramm für die Spalte ColumnA könnte folgenden Bericht generieren.

Gültigkeitsbereich

Prozentsatz der Tabellenzeilen im Bereich

'aaa' bis 'hzz'

50%

'iaa' bis 'nzz'

33%

'oaa' bis 'rzz'

00%

'taa' bis 'zzz'

17%

Verschiedene OLE DB-Datenquellen zeichnen Verteilungsstatistiken zu verschiedenen Spaltenkombinationen auf, und die von einem OLE DB-Anbieter gemeldete Sammlung von Statistiken wird durch die Implementierung definiert. Beispielsweise gilt für SQL Server, Version 6.5 oder früher, dass Verteilungsstatistiken ausschließlich für Spalten erstellt werden, die zu Indizes gehören, und nur eine Statistik für jeden Index vorhanden ist, der für eine Tabelle definiert ist. SQL Server, Version 7.0 oder höher, erstellt die folgenden Statistiken:

  • Eine Statistik für jeden in einer Tabelle definierten Index.

  • Eine Statistik für jede CREATE STATISTIC-Anweisung.

  • Eine Statistik für jede automatisch generierte Statistik.

Eine Spalte verfügt über ein hohes Maß an Selektivität, wenn sie wahrscheinlich nur eine geringe Anzahl von Zeilen für einen bestimmten, in einem Prädikatargument angegebenen Wert zurückgibt. Die Verteilungsstatistik kann zur Schätzung des Selektivitätsgrades verwendet werden:

  • Spalten mit einer hohen Kardinalität besitzen eine größere Anzahl von Datenwerten, und jeder Datenwert stimmt wahrscheinlich mit einer kleineren Anzahl von Zeilen überein, als dies bei einer Spalte mit einer niedrigen Kardinalität der Fall ist.

  • Wenn ein OLE DB-Anbieter ein Histogramm über die Verteilung der Werte in einer Spalte bereitstellt, kann der SQL Server-Abfrageoptimierer auch schätzen, ob sich der bestimmte Wert in einem Prädikatargument in einem Bereich mit einer hohen oder niedrigen Selektivität befindet.

Eine gute Verteilungsstatistik für einen Verbindungsserver kann den Optimierer zudem dabei unterstützen, einen effizienten Ausführungsplan für den lokalen Teil einer verteilten Abfrage zu erstellen.

Der SQL Server-Abfrageoptimierer verwendet die Verteilungsstatistik zur Verringerung der Datenmenge, die zwischen dem OLE DB-Anbieter und SQL Server übertragen werden muss. So kann SQL Server z. B. bei der Ausführung einer verteilten Verknüpfung zwischen TableA auf dem lokalen Server und TableB auf einem Verbindungsserver die Verteilungsstatistik verwenden, um den effizientesten Prozess zu ermitteln:

  • Senden der Zeilen aus TableA, die mit Nichtverknüpfungsprädikaten übereinstimmen, zum Verbindungsserver und Veranlassen, dass der Verbindungsserver die Verknüpfung vornimmt.

  • Abrufen der Zeilen aus TableB, die mit Nichtverknüpfungsprädikaten übereinstimmen, auf den lokalen Server und Vornehmen der Verknüpfung auf dem lokalen Server.

Wenn ein OLE DB-Anbieter keine Kardinalitätsinformationen zu einer Spalte meldet, geht der SQL Server-Abfrageoptimierer von einer niedrigen Kardinalität aus. Wenn ein Anbieter kein Verteilungshistogramm für eine Statistik meldet, geht der Optimierer so vor, als ob die Werte gleichmäßig in den Zeilen der Tabelle verteilt wären.

SQL Server verwendet die folgenden Erweiterungen von OLE DB-Anbietern, um Verteilungsstatistiken auszugeben:

  • Eine Datenquelleneigenschaft, DBPROP_TABLESTATISTICS, zeigt an, ob der Anbieter Verteilungsstatistiken ausgibt.

  • Das IDBSchemaRowset TABLE_STATISTICS führt die für eine bestimmte Basistabelle verfügbaren Statistiken auf. Dies schließt die Spalten- und die Zeilenkardinalität ein.

  • Für IOpenRowset::OpenRowset können Argumente verwendet werden, die eine Statistik identifizieren. Wird eine Statistik angegeben, gibt OpenRowset ein Histogrammrowset zurück, das die Verteilung der Werte in der ersten Spalte darstellt, die von der unter StatisticID angegebenen Statistik erfasst wurde.

Diese Erweiterungen zu OLE DB sind in OLE DB, Version 2.6 oder höher, enthalten. Informationen zu diesen Erweiterungen im Hinblick auf Verteilungsstatistiken finden Sie in der OLE DB 2.6-Spezifikation.

Ein OLE DB-Anbieter kann seine Leistung verbessern, indem Stichproben nur für einen Teil der Zeilen in einer Basistabelle ausgewertet werden, um die Verteilungsstatistiken und Histogramme zu ermitteln. Diese Anbieter sollten ihre Kardinalität und die Histogrammdaten so anpassen, dass sie die Gesamtwerte für die Tabelle widerspiegeln, ehe sie in die TABLE_STATISTICS- und Histogrammrowsets ausgegeben werden.

Ob ein OLE DB-Anbieter die Daten im TABLE_STATISTICS-Rowset und im Histogrammrowset mit den aktuellen Inhalten der Basistabelle aktualisiert, wird durch die Implementierung definiert.

HinweisHinweis

Um die besten Abfragepläne erstellen zu können, wenn Sie eine Tabelle auf einem Verbindungsserver verwenden, muss der Abfrageprozessor auf Datenverteilungsstatistiken vom Verbindungsserver zugreifen können. Benutzer mit eingeschränkten Rechten für einige Spalten der Tabelle verfügen unter Umständen nicht über ausreichende Rechte zum Abrufen nützlicher Statistikinformationen und erhalten daher unter Umständen weniger effiziente Abfragepläne und eine schlechtere Leistung. Wenn der Verbindungsserver eine Instanz von SQL Server ist, muss der Benutzer zum Anzeigen der verfügbaren Statistikinformationen Besitzer der Tabelle sein oder Mitglied der festen Serverrolle sysadmin, der festen Datenbankrolle db_owner oder der festen Datenbankrolle db_ddladmin auf dem Verbindungsserver sein.