2017-07-23 1 views
0

einen Primärschlüsseleinstellung, einen Verbund aus 3 Spalten, erzeugt einen Index, der mit angesehen werden können:postgres Präfix Indexverwendung

select t.relname as tbl, i.relname as idx, a.attname as col 
from pg_class t, pg_class i, pg_index ix, pg_attribute a 
where t.oid = ix.indrelid 
and i.oid = ix.indexrelid 
and a.attrelid = t.oid 
and a.attnum = any(ix.indkey) 
and t.relkind = 'r' 
and t.relname not like 'pg%' 
order by t.relname, i.relname; 

Die Tabelle ist „Kunde“, wie in der TPC-C benchmarking Führung definiert. Die Frage, die ich habe, ist, wenn man den Fremdschlüssel auf dem Tisch erstellt, wie es der Leitfaden erfordert, muss man einen entsprechenden Index erstellen. Vorausgesetzt, dass die 2 Spalten für den Fremdschlüssel mit den ersten beiden Spalten des Primärschlüssels übereinstimmen, würde der als Teil der Primärschlüsseleinschränkung generierte Index ausreichen?

Tabelle & Schlüssel DDL:

create table customer (c_id numeric,c_d_id numeric,c_w_id numeric ..); 

alter table customer add constraint pk_customer 
primary key (c_w_id, c_d_id, c_id) ; 

alter table customer add constraint fk_cust_district 
foreign key (c_w_id, c_id) references district (d_w_id, d_id); 

Der Grund für die Frage ist, dass in Oracle und SQL Anywhere braucht man einen Index und die entsprechenden Optimierer nicht schaffen würde die Verwendung von welcher auch immer Index mit einem verbesserten Überweisung Leistung unterstützt machen, In diesem Fall wird das 2-Spalten-Präfix des Index als Teil der Primärschlüsseleinschränkung generiert.

Antwort

1

Die Art, wie Ihre Tabellen erstellt werden, kann der Primärschlüssel-Index die Fremdschlüsseleinschränkung nicht gut unterstützen, da die Spalten der Fremdschlüsseldefinition nicht am Anfang der Primärschlüsseleinschränkungsdefinition sind.

Der Primärschlüssel Index ist besser als nichts, obwohl: zumindest kann es für c_w_id gescannt werden (mit c_id als Filter), aber nicht für beide Spalten zur gleichen Zeit, als wäre am effizientesten.

So PostgreSQL wird nutzen Sie den Index zur Hand, aber es wird immer noch nicht sehr effizient sein.

Wenn es keinen guten Grund gibt, dass die Primärschlüsselspalten in dieser Reihenfolge definiert sind, schlage ich vor, dass Sie die zweite und dritte Spalte in der Primärschlüsseldefinition tauschen. Dann ist der Index perfekt für die Fremdschlüsselabhängigkeit geeignet.

Wenn dies nicht möglich ist, erstellen Sie einen zweiten Index unter (c_w_id, c_id).

(Dies würde genau das gleiche auf Oracle, nebenbei gesagt, außer dass sie einen Index-Scan von – meiner Meinung nach – fragwürdigen Verdienste überspringen hat.)

+0

Ja, ich sehe Ihr Punkt, hatte c_d_id , c_id war umgekehrt, dh c_id, c_d_id, dann wäre ein Index nicht notwendig gewesen, aber um einen Skip-Scan zu vermeiden, ist es am besten, einen neuen Index zu erstellen. Angesichts des in TPC-C 5.11 beschriebenen Transaktionsprofils ist es außerdem am besten, einen neuen Index zu erstellen. – alortimor