Frage

Zum Beispiel:

Given columns A,B,C,D,

IX_A is an index on 'A'

IX_AB is a covering index on 'AB'

IX_A sicher entfernt werden kann, denn es ist überflüssig: IX_AB wird an seiner Stelle verwendet werden. Ich möchte wissen, ob dies verallgemeinert:

Wenn ich:

IX_AB
IX_ABC
IX_ABCD

und so weiter,

Kann die kleinere Indizes noch sicher entfernt werden? Das heißt, IX_ABC IX_AB überflüssig zu machen, und tut IX_ABCD sowohl IX_AB und IX_ABC überflüssig machen?

War es hilfreich?

Lösung

In der Regel - und dies variiert von Server zu Server - a. Abdeckenden Index mit kleineren Auswahl des Index abdecken

Wenn Sie also einen Index haben, a, b, c umfasst, die in der Regel automatisch erhalten Sie einen Index, der eine abdeckt, und a, b.

Sie sind nicht zu haben, beispielsweise ein abdeckenden Index von b, c garantiert.

Andere Tipps

Ja, zum größten Teil.

Allerdings ist IX_ABCD nicht sehr hilfreich als Ersatz für, sagen wir, IX_BCD.

Es gibt eine Einschränkung, aber: Indizes können nach wie vor erforderlich Platte liest, so dass, wenn C und D die Größe des Index explodieren, wird es einige Ineffizienz sein in aufzublicken A, B in IX_ABCD, die nicht auftreten würde, wenn sie suchen up in IX_AB.

Allerdings ist dieser Unterschied wahrscheinlich durch die zusätzliche Leistungseinbußen überwiegt der Aufrechterhaltung IX_AB getrennt.

Das Wichtigste ist, die führenden Spalten im Index. Wenn Sie den Index IX_ABCD die folgenden Fragen haben den Index verwenden:

select * from table where A = 1

select * from Tabelle, in der A = 1 und B = 1

select * from Tabelle, in der A = 1 und B = 1 und C = 1

Doch die folgenden höchstwahrscheinlich nicht verwendet den Index (zumindest nicht, wie Sie bestimmt):

select * from table where B = 1

select * from Tabelle, in der C = 1

select * from Tabelle, in der B = 1 und C = 1

Das Wichtigste ist, dass die führenden Spalten verwendet werden. Deshalb ist die Reihenfolge der Spalten, wenn der Index erstellt wird, ist von Bedeutung.

Nicht unbedingt. Zwar ist richtig, dass ein Index für (A, B, C) für ein Filterungs Prädikat auf A oder einer Bestellanforderung auf einem oder eine Verknüpfungsbedingung auf A verwendet werden, die nicht notwendigerweise bedeuten, dass der Index (A) allein nutzlos . Wenn der Index auf (A, B, C) deutlich weiter als (A), dann wird ein Bereich Scan A allein signifikant I / O sparen, weil es weniger Seiten lesen würde (schmalere Index ).

ut ich admint, dass dies die Ausnahme sein würde und nicht die Regel. Im allgemeinen sicher ist, einen Index für A zu entfernen, wenn ein anderes auf (A, B) vorhanden ist. Man beachte, dass ein Index für (A, B) erfüllt keine Filterung auf B so ist, sicher zu entfernen, wenn nur die äußerste linke Spalte (n) die gleiche ist. Einige Datenbanken haben ‚skip-Scan‘ Operatoren, die einen Index für (A, B) zum Nachschlagen B verwenden können, aber das ist ein sehr schmaler Grenzfall.

Immer am besten nicht zu übernehmen, etwas über Datenbank-Engine Interna und prüfen Sie tatsächlich die eigentlichen Abfragepläne verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top