Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » UltraLite - Datenbankverwaltung » UltraLite-Datenbanken verwenden » UltraLite-Performance und -Optimierung

 

Abfrageperformance durch Index-Hashing optimieren

Sie können die Performance Ihrer Abfragen optimieren, indem Sie eine bestimmte Größe für den maximalen Hash-Wert wählen. Ein Hash-Schlüssel repräsentiert die tatsächlichen Werte der indizierten Spalte. Mit einem Index-Hash soll der ressourcenintensive Vorgang beim Suchen, Laden und Entpacken von Zeilen zur Ermittlung des indizierten Werts vermieden werden. Er vermeidet diese Vorgänge, indem eine ausreichende Menge der tatsächlichen Zeilendaten mit der Zeilen-ID aufgenommen werden.

Eine Zeilen-ID gestattet es UltraLite, die tatsächlichen Zeilendaten in der Datenbankdatei zu finden. Wenn Sie die Hash-Größe auf 0 setzen (was den Index-Hash deaktiviert), enthält der Indexeintrag nur diese Zeilen-ID. Wenn Sie die Hash-Größe auf einen anderen Wert als 0 setzen, wird auch ein Hash-Schlüssel verwendet. Ein Hash-Schlüssel kann alle umgewandelten Daten in der Zeile oder einen Teil davon enthalten und wird zusammen mit der Zeilen-ID auf der Indexseite gespeichert.

Wie viele Zeilendaten der Hash-Schlüssel enthält, wird von Folgendem bestimmt:

  • Zum Teil von der konfigurierten Eigenschaft der maximalen Hash-Größe. Weitere Hinweise finden Sie unter Optimale Hash-Größe wählen.

  • Zum Teil davon, wie viele Zeilendaten tatsächlich für den Datentyp der Spalte erforderlich sind.

Ein Hash-Beispiel

Ein Index-Hash-Wert verwaltet die Reihenfolge der tatsächlichen Zeilendaten von indizierten Spalten. Wenn Sie z.B. die Spalte LastName für eine Tabelle namens Employees indiziert haben, werden möglicherweise vier Namen wie folgt angezeigt:

Anders

Anderseck

Andersen

Anderson

Wenn Sie die ersten sechs Buchstaben in den Hash-Wert einbeziehen, werden Ihre Hash-Schlüssel für diese Zeilenwerte wie folgt angezeigt:

Anders

Anders

Anders

Anders

Diese Einträge sehen gleich aus, wobei der erste "Anders" in der Liste den tatsächlichen Wert von Anders repräsentiert. Mit dem letzten "Anders" in der Liste wird hingegen der tatsächliche Zeilenwert Anderson dargestellt.

Sehen Sie sich die folgende Anweisung an:

SELECT * 
FROM Employees
WHERE LastName = 'Andersen';

Wenn die Employees-Tabelle einen sehr hohen Anteil von Namen ähnlich "Andersen" enthält, ist der Hash-Schlüssel möglicherweise nicht eindeutig genug, um einen Performancevorteil zu erzielen. In diesem Fall kann UltraLite nicht ermitteln, ob einer der Hash-Schlüssel die Bedingungen dieser Anweisung erfüllt. Wenn mehrere gleiche Index-Hash-Schlüssel vorhanden sind, muss UltraLite dennoch Folgendes durchführen:

  1. Die Tabellenteile suchen, die der betreffenden Zeilen-ID entspricht.

  2. Die Daten entladen und entpacken, damit der Wert ausgewertet werden kann.

Ein Nutzen für die Performance wird nur erzielt, wenn UltraLite eine erhebliche Anzahl von eindeutigen Hash-Schlüsseln erkennen kann, damit sich die Berechnung der Abfragebedingung unmittelbar auf den Index auswirkt. Wenn die Tabelle Employees z.B. Tausende Namen enthält, bietet der Hash-Schlüssel mit sechs Buchstaben immer noch einen gewissen Performancevorteil. Wenn die Employees-Tabelle jedoch nur eine relativ große Anzahl von Namen enthält, die mit Anders* beginnen, sollte der Hash-Wert mindestens sieben Buchstaben umfassen, damit anteilsmäßig mehr eindeutige Hash-Schlüssel verwendet werden. Daher werden die ursprünglichen vier Namen am Beginn dieses Beispiels nun mit diesen Hash-Schlüsseln dargestellt:

Anders

Anderse

Anderse

Anderso

Jetzt müssten nur zwei der vier Zeilenwerte entpackt und ausgewertet werden, und nicht alle vier.

Siehe auch