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 Microsoft SQL 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'

Wenn ColumnA und ColumnB in einer Statistik erfasst sind, beträgt die Kardinalität der kombinierten Werte der beiden Spalten 5. Dies bedeutet, dass fünf eindeutige Kombinationen von Werten für ColumnA und ColumnB vorhanden sind, da die ersten beiden Spalten denselben kombinierten Wert ('abc' + 'xyz') besitzen.

Die Kardinalität von ColumnA ist 4, die Kardinalität von ColumnB ist 2. Ein einfaches, aus vier Schritten bestehendes Histogramm für 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 eines verteilten Joins 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 DBPROP_TABLESTATISTICS-Datenquelleneigenschaft zeigt an, ob der Anbieter Verteilungsstatistiken ausgibt.

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

  • IOpenRowset::OpenRowset nimmt Argumente an, die eine Statistik identifizieren. Wird eine Statistik angegeben, gibt OpenRowset das Histogrammrowset zurück, das die Verteilung der Werte in der ersten Spalte, die von der unter StatisticID angegebenen Statistik erfasst wurde, darstellt.

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 bei Verwendung einer Tabelle auf einem Verbindungsserver die besten Abfragepläne zu erstellen, muss der Abfrageprozessor Datenverteilungsstatistiken vom Verbindungsserver aufweisen. Benutzer, die über eingeschränkte Berechtigungen für beliebige Tabellenspalten verfügen, haben möglicherweise nicht die erforderlichen Berechtigungen, um alle nützlichen Statistiken abzurufen. Der Abfrageplan kann daher weniger effizient und die Leistung beeinträchtigt sein. Zum Anzeigen aller verfügbaren Statistiken muss der Benutzer Besitzer der Tabelle oder Mitglied der festen Serverrolle sysadmin, der festen Datenbankrolle db_owner oder der festen Datenbankrolle db_ddladmin auf dem Verbindungsserver sein, wenn der Verbindungsserver eine Instanz von SQL Server ist.