Nehmen wir an, ich habe eine Tabelle mit Feldern A
und B
. Ich stelle regelmäßig Abfragen zu A
+ B
, also habe ich einen zusammengesetzten Index zu erstellt (A,B)
. Würden nur Abfragen über A
den zusammengesetzten Index auch vollständig optimiert?
Außerdem habe ich einen Index für erstellt A
, aber Postgres verwendet den zusammengesetzten Index nur für Abfragen für A
. Wenn die vorherige Antwort positiv ist, spielt es vermutlich keine Rolle, aber warum wird standardmäßig der zusammengesetzte Index ausgewählt, wenn der einzelne A
Index verfügbar ist?
explain analyze
und den Abfragetext anzeigen ?Antworten:
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 Siepg_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 einesUNIQUE
Constraints ist. Seit Postgres 11 müssen Sie möglicherweise stattdessen nurb
noch die Einschränkungsdefinition mit derINCLUDE
Klausel anhängen . Details im Handbuch.Oder erstellen Sie
(b,a)
stattdessen den neuen Index am , um Abfragen nurb
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:
Mehr zu HOT Updates:
So messen Sie Objektgrößen:
quelle
Entsprechend Ihrer Frage haben Sie eine Tabelle mit den Feldern A und B. Wenn Ihre Frage lautet:
Optimierer wählt den zusammengesetzten Index, um zufälligen Zugriff zu vermeiden!
quelle
Dies ist der Fall, wenn Sie nur das erste Prädikat verwenden.
Es wird gescannt, wenn Sie die ersten Spalten des zusammengesetzten Schlüssels und die Nichtschlüsselspalte des zusammengesetzten Schlüssels verwenden.
Um es auszutricksen, können Sie einfach Prädikate wie diese und dann eine Spalte ohne Schlüssel kopieren:
[A, B] ist Ihr Index, [C] - eine andere Spalte
Um den Index zu verwenden, schreiben Sie als:
Der Index wird nur verwendet, wenn ein oder zwei Prädikate [A] oder [A], [B] vorhanden sind. Es wird nicht in der Reihenfolge [B], [A] oder [A], [C] verwendet. Um den Index mit der zusätzlichen Spalte [C] verwenden zu können, müssen Sie den Index erzwingen, indem Sie Prädikate wie [A], [B] und [C] anordnen.
quelle
B=B
? Ich denke, du erreichst nichts, also stimme ich ab, wenn keine Beweise vorliegen, die nicht nur vom Optimierer ignoriert werdenB=B
ist effektiv das gleiche wieB IS NOT NULL
, was unangebracht scheint. Sicherlich nicht erforderlich, um einen Index für zu verwenden(a,b)
.