2009-05-12 6 views
9

Una tabella delle relazioni è la soluzione comune per rappresentare una relazione molti-a-molti (m: n).Qual è la strategia di indicizzazione ottimale per una tabella delle relazioni?

Nella forma più semplice, unisce chiavi esterne che fanno riferimento le due tabelle relative ad una nuova chiave primaria composta:

 
A  AtoB  B 
----  ----  ---- 
*id  *Aid  *id 
data  *Bid  data 

Come dovrebbe essere indicizzati per fornire prestazioni ottimali in ogni ENTRA situazione?

  1. indice cluster over (Aid ASC, Bid ASC) (questo è obbligatorio in ogni caso, credo)
  2. opzione # 1, più un indice in più oltre (Bid ASC, Aid ASC)
  3. o l'opzione # 1, più un indice in più oltre (Bid ASC)
  4. altre opzioni? Roba specifica del venditore, forse?
+0

Bella domanda, grazie. Farò un post nel mio blog fuori di esso. – Quassnoi

+0

Il mio Google Reader me lo dirà.:) – Tomalak

+0

Ah, quindi sei l'altro ragazzo! – Quassnoi

risposta

6

ho fatto alcuni test, e qui è l'aggiornamento :

Per coprire tutti i casi possibili, è necessario avere:

CLUSTERED INDEX (a, b) 
INDEX (b) 

Questo riguarderà tutti i JOIN sutiations E ORDER BY

si noti che un indice su B è in realtà ordinato in base (B, A) in quanto fa riferimento a righe in cluster.

Finchè i vostri a e b tabelle hanno PRIMARY KEY 's su id, si non lo fanno necessità di creare indici aggiuntivi per gestire ORDER BY ASC, DESC.

vedere la voce nel mio blog per maggiori dettagli:

+0

Hai ancora bisogno di un indice su (B DESC) per usare un indice per ORDER BY b, un DESC – Quassnoi

+0

Un INDICE (b, a) non ha un vantaggio? – Tomalak

+2

INDICE (b) è in realtà INDICE (b, a, b), poiché la tabella è in cluster. Un indice su (b, a) sarebbe in realtà INDICE (b, a, a, b) che è totalmente inutile. – Quassnoi

1

immagino soluzione 2 è ottimale. Sceglierei l'ordine dell'indice cluster esaminando i valori e prevedendo quale ha più righe distinte. Quello va prima. È inoltre importante avere gli indici unique o primary key nelle tabelle padre.

seconda del DBMS, numero 3 potrebbe funzionare buono come numero 2. Si potrebbe o non potrebbe essere abbastanza intelligente per prendere in considerazione i valori (chiave di indice cluster) in l'indice non cluster per altro che riferendosi alla riga attuale. Se può usarlo, allora il numero 3 sarebbe meglio.

+0

Ma quale * è ottimale? 1., 2. o 3.? :) Inoltre, la domanda è più una guida generale che un problema specifico. – Tomalak

+0

Tomalak: Pensavo volessi dire tutti loro :) Oh, non ho visto # 1 + ... Io sceglierei il numero 2. –

+0

Hm, forse dovrei riformattare la domanda per renderlo più chiaro. :) – Tomalak

1

ho fatto alcuni test rapido e sporco esaminando i piani di esecuzione in SQL Server 2005. I piani hanno dimostrato che SQL utilizza l'indice cluster su Aid, l'offerta per la maggior parte delle query. L'aggiunta di un indice su Offerta (ASC) mostra che è utilizzato per le query di tipo

select * from A 
    inner join AtoB on Aid = A.id 
    inner join B on Bid = B.id 
where Bid = 1 

Così sto che votano per soluzione # 3.

+0

Hai anticipato cosa @Quassnoi ha avuto il tempo di rintracciare e spiegare. +1 in ogni caso. :) – Tomalak

Problemi correlati