2010-05-21 15 views
5

Ho una tabella di transazioni storiche di grandi dimensioni (15-20 milioni di righe MOLTE colonne) e una tabella con una riga una colonna. La tabella con una riga contiene una data (ultima data di elaborazione) che verrà utilizzata per estrarre i dati nella tabella della transazione ('process_date').SQL Query Theory Question

Domanda: dovrei unire internamente la tabella 'process_date' alla tabella delle transazioni o la tabella delle transazioni alla tabella 'process_date'?

+2

Sarei molto sorpreso se sarebbe causa di variazioni nei piani di esecuzione. –

+2

Appena controllato con due dei nostri tavoli. Restituisce lo stesso identico piano di esecuzione. Per rispondere alla tua domanda, non importa. –

+0

Il piano di esecuzione ha una correlazione diretta con l'efficienza? Cioè se 2 piani sono esattamente gli stessi il tempo di esecuzione è esattamente lo stesso? – Keng

risposta

6

Questo è come io lo farei

SELECT <<list only columns you need>> 
FROM large_historical_transaction_table t 
WHERE EXISTS (SELECT 1 FROM OneRowTable o 
       WHERE o.last_processing_date = t.process_date) 
+0

Sono sicuro che tu sappia di cosa stai parlando, con un nome come SQLMenace e un rep di 17k, ma a prima vista sembra che la subquery correlata verrà eseguita per ogni riga nella tabella grande? – mdma

+0

+1, @mdma, sembra così, ma questo è più veloce del normale join –

+0

Grazie per i chiarimenti. Mi interessa entrare nei dettagli di come è più veloce: conosci i link che descrivono questo in modo più dettagliato? – mdma

2

un inner join è una relazione bidirezionale simmetrica, in generale, non importa, ma in questo caso vorrei suggerire che non si aggiungono a tutti, leggere la data di soglia in una variabile e passarla all'altra query di selezione come parametro ...

2

Per la leggibilità, vorrei unirsi internamente dalla tabella delle transazioni per indicare esplicitamente che la seconda tabella con la data agisce semplicemente come un filtro .

2

Quando si uniscono le tabelle, Query Optimizer annota entrambi rapidamente per determinare l'implementazione del join più appropriata. Logicamente l'inner join è simmetrico, ma l'implementazione può favorire un lato rispetto all'altro per migliorare le prestazioni.

-2

una croce uniscono lo farà:

SELECT t.col1, t.col2, p.process_date 
FROM Transactions t, Process p; 
+1

No, non lo farebbe. Restituire ** tutti ** i record dalle Transazioni. Questo non è ciò che l'OP vuole. –

+1

Ah, mi sono perso. In tal caso è solo un join interiore. Grazie per la correzione. – sqlvogel

+0

Se modifichi la risposta, posso fare qualcosa a riguardo -1. – Keng