2010-06-09 8 views
6

Ho una tabella T1 con 60 righe e 5 colonne: ID1, ID2, info1, info2, info3.Velocizza una query, semplice unione interna con un grande tavolo e un tavolino

Ho una tabella T2 con 1,2 milioni di righe e altre 5 colonne: ID3, ID2, info4, info5, info6.

Voglio ottenere (ID1, ID2, info4, info5, info6) da tutte le righe in cui gli ID2 corrispondono. Attualmente la mia query assomiglia a questa:

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1, T2 
WHERE T1.ID2 = T2.ID2; 

Questo richiede circa 15 secondi per l'esecuzione. La mia domanda è - dovrebbe durare così a lungo, e se no, come posso accelerarla? Immagino che non dovrebbe, dal momento che T1 è così piccolo.

Ho chiesto a PostgreSQL di SPIEGARE la query, e dice che ha hash T2, quindi hash si unisce a quell'hash con T1. Sembra che l'hashing T2 sia ciò che impiega così tanto tempo. C'è un modo per scrivere la query in modo che non deve hash T2? Oppure, c'è un modo per avere in cache l'hash di T2 in modo che non lo rifacci? Le tabelle verranno aggiornate solo ogni pochi giorni.

Se fa la differenza, T1 è una tabella temporanea creata in precedenza nella sessione.

risposta

13

Non dovrebbe prendere così a lungo :)

creazione di un indice sulla T2(ID2) dovrebbe migliorare le prestazioni della query:

CREATE INDEX idx_t2_id2 ON t2 (id2); 
+1

bello ora è molto veloce =). – Claudiu

+0

ho aggiunto degli indici anche al resto del database, e ora posso aggiungervi nuovi elementi 50 volte al secondo invece che .. una volta ogni 2 secondi. sweeet! – Claudiu

+0

@PeterLang se potessi scrivere la domanda completa, capire questo sarebbe molto più facile per i principianti. – 3kstc

0

potrebbero utilizzare JOIN aumento della velocità di query:

SELECT T1.ID1, T2.ID2, 
    T2.info4, T2.info5, T2.info6 
FROM T1 
JOIN T2 ON T2.ID2 = T1.ID2; 

Non so esattamente, ma potrebbe essere la tua richiesta prima di unire tutte le righe in entrambe le tabelle, e successivamente applicare WHERE le condizioni e il problema.

E naturalmente, come ha visto Peter Lang, è necessario creare un indice.

+0

ci ho già pensato, ma non ha fatto la differenza. Penso che il mio modo sia lo zucchero sintassi per questo modo. – Claudiu

+0

Quindi non avevo ragione :) Ma sempre quando voglio unirmi alle tabelle uso JOIN invece il tuo vaiant;) –

+0

La sintassi JOIN è stata standardizzata molto più tardi rispetto all'utilizzo tradizionale della clausola join-conditions-in-the-where. Posso ricordare che sono appena supportati in Oracle 8 o giù di lì. IMHO un caso di un nuovo standard che in realtà rende le cose migliori (specialmente i join esterni) per una volta. – araqnid

0

Innanzitutto, fare un join.

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1 
    JOIN T2 ON T1.ID2 = T2.ID2; 

Quindi provare a creare e indicizzare su T2.d2.

In caso contrario, se possibile, è possibile aggiungere la colonna ID1 a T2. Aggiornalo di conseguenza ogni pochi giorni come reclami. Quindi è solo una semplice query su T2 senza join.

SELECT T2.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T2 
    WHERE T2.ID2 = A_VALUE; 

Ancora una volta, sarà consigliato un indice su T2.ID2.

Problemi correlati