Obgleich Indizes die Performance von Anweisungen, die nach bestimmten Bereichen von Schlüsselwerten suchen, erheblich erhöhen, erscheinen zwei im Index aufeinanderfolgende Zeilen nicht unbedingt auf der selben Tabellenseite der Datenbank.
Sie können ferner umfangreiche Index-Scans verbessern, indem Sie den Index als "Clustered" deklarieren. Die Verwendung eines Clustered-Indexes erhöht die Chance, dass zwei Zeilen aus benachbarten Indexeinträgen auch auf der selben Seite der Datenbank erscheinen. Dies kann zu weiteren Performance-Verbesserungen führen, da die Häufigkeit des Einlesens einer Tabellenseite in den Pufferpool reduziert wird.
Das Vorhandensein eines Indexes mit einer Clustered-Eigenschaft veranlasst den Datenbankserver, zu versuchen, Tabellenzeilen in ungefähr der gleichen Reihenfolge zu speichern, in der sie im Clustered-Index erscheinen. Während der Datenbankserver zwar versucht, die Schlüsselreihenfolge einzuhalten, ist das Clustering ein Annäherungsverfahren, und ein vollständiges Clustering kann nicht garantiert werden. Der Datenbankserver ist daher nicht in der Lage, die Tabelle sequenziell zu durchsuchen und alle Zeilen in der Schlüsselreihenfolge eines Clustered-Indexes abzurufen. Um sicherzustellen, dass die Tabellenzeilen in sortierter Reihenfolge geliefert werden, ist ein Zugriffsplan erforderlich, der entweder über den Index auf die Zeilen zugreift oder der einen physischen Sortiervorgang durchführt.
Der Optimierer nutzt einen Index mit Clustered-Eigenschaft, indem er die erwarteten Kosten eines indexierten Abrufs so abwandelt, dass die erwartete physische Nachbarschaft von Tabellenzeilen mit übereinstimmenden oder angrenzenden Indexschlüsselwerten berücksichtigt wird.
Der Umfang des Clustering für eine bestimmte Tabelle kann im Laufe der Zeit zurückgehen, wenn immer mehr Zeilen eingefügt oder aktualisiert werden. Der Datenbankserver zeichnet automatisch den Umfang des Clusterings für jeden einzelnen Clustered-Index in der Systemtabelle ISYSPHYSIDX auf. Falls der Datenbankserver feststellt, dass die Zeilen in einer Tabelle beträchtlich unclustered werden, passt der Optimierer seine erwarteten Indexabrufkosten an.
Wenn Sie vorhaben, einen der Indizes auf der Tabelle zu einem Clustered-Index zu machen, müssen Sie die erwartete Abfrage-Systemlast berücksichtigen. Dies wird üblicherweise ein Experimentieren erfordern. Im Allgemeinen kann der Datenbankserver einen Clustered-Index verwenden, um die Performance zu steigern, wenn die folgenden Bedingungen bei einer bestimmten Abfrage gelten:
Viele der Tabellenseiten, die für die Erfüllung der Abfrage benötigt werden, befinden sich noch nicht im Speicher. Wenn sich Tabellenseiten bereits im Speicher befinden, muss der Datenbankserver diese Seiten nicht lesen und eine Clusterbildung wäre sinnlos.
Die Abfrage kann durch einen Index-Abruf erfüllt werden, von dem zu erwarten ist, dass er eine nicht-triviale Zeilenanzahl zurückgibt. Clusterbildung ist beispielsweise bei einfachen Primärschlüssel-Suchvorgängen meist irrelevant.
Der Datenbankserver muss, im Gegensatz zu einem reinen Indexabruf, die Tabellenseiten tatsächlich lesen.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |