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.
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