Es ist sicherlich. Wir haben das unter dieser verwandten Frage ausführlich besprochen:
Der Speicherplatz wird in Vielfachen von MAXALIGN
8 Byte auf einem 64-Bit-Betriebssystem oder (viel seltener) 4 Byte auf einem 32-Bit-Betriebssystem zugewiesen . Wenn Sie sich nicht sicher sind, überprüfen Sie pg_controldata
. Dies hängt auch von den Datentypen der indizierten Spalten (einige erfordern Ausrichtungsabstände) und dem tatsächlichen Inhalt ab.
Ein Index für beispielsweise zwei integer
Spalten (jeweils 4 Byte) ist in der Regel genau so groß wie ein Index für nur eine Spalte, bei dem weitere 4 Byte durch Ausrichtungsauffüllung verloren gehen.
In einem solchen Fall hat der Abfrageplaner wirklich keinen Nachteil, einen Index für zu verwenden (a,b)
- im Vergleich zu einem Index für nur (a)
. Im Allgemeinen ist es für mehrere Abfragen vorzuziehen, denselben Index zu verwenden. Die Chance, dass es (oder Teile davon) sich im (schnellen) Cache befinden, wächst, wenn es gemeinsam genutzt wird.
Wenn Sie bereits einen Index für pflegen (a,b)
, ist es nicht sinnvoll, einen weiteren Index nur für zu erstellen (a)
- es sei denn, er ist wesentlich kleiner. Das gleiche gilt nicht für wahr (b,a)
vs. (a)
. Folgen Sie dem Link in der ersten Zeile, um mehr darüber zu erfahren.
Wenn Sie aus der entgegengesetzten Richtung kommen und einen solchen zusätzlichen Index benötigen, ziehen Sie in (a,b)
Betracht, einen vorhandenen Index nur auf (a)
- wenn möglich - abzulegen. Oft nicht möglich, da dies der Index einer PK oder eines UNIQUE
Constraints ist. Seit Postgres 11 müssen Sie möglicherweise stattdessen nur b
noch die Einschränkungsdefinition mit der INCLUDE
Klausel anhängen . Details im Handbuch.
Oder erstellen Sie (b,a)
stattdessen den neuen Index am , um Abfragen nur b
zusätzlich abzudecken . Für Gleichheitsbedingungen spielt die Reihenfolge der Indexausdrücke in Btree-Indizes keine Rolle. Dies ist jedoch bei Bereichsbedingungen der Fall. Sehen:
Das Einfügen zusätzlicher Spalten in einen Index birgt potenzielle Nachteile , auch wenn nur der Platz verwendet wird, der ansonsten durch Ausrichtungsauffüllung verloren geht:
- Immer wenn die zusätzliche Spalte aktualisiert wird, muss der Index jetzt ebenfalls aktualisiert werden, wodurch möglicherweise zusätzliche Kosten für Schreibvorgänge anfallen und der Index aufgebläht wird.
- HOT-Updates (Heap Only Tuple) für die Tabelle sind nicht möglich, solange eine Indexspalte beteiligt ist.
Mehr zu HOT Updates:
So messen Sie Objektgrößen: