Domanda

La mia domanda è simile a questo delle operazioni , ma con un po 'di torsione, in modo Penso che sia giusto chiedere.

sto usando Teradata. E ho 2 tabelle:. table1, table2

table1 ha solo una colonna id.
table2 ha le seguenti colonne: id, val

Potrei sbagliarmi, ma credo che queste due affermazioni danno gli stessi risultati.

Istruzione 1.

SELECT table1.id, table2.val
FROM table1
INNER  JOIN table2
ON table1.id = table2.id
WHERE table2.val<100

Istruzione 2.

SELECT table1.id, table3.val
FROM table1
INNER JOIN (
    SELECT *
    FROM table2
    WHERE val<100
)  table3
ON table1.id=table3.id

Le mie domande è, sarà l'ottimizzatore di query essere abbastanza intelligente da
- eseguire la clausola WHERE prima poi unirsi più tardi nella Dichiarazione 1
- Sappiate che tabella 3 non è effettivamente necessario in Statement 2

Sono abbastanza nuovo per SQL, quindi per favore educare me se sto fraintendendo tutto.

È stato utile?

Soluzione

questo dipenderebbe molte molte cose (dimensioni della tabella, indice, chiave di distribuzione, ecc), si deve solo controllare il piano di esecuzione:

non si dice quale database, ma qui ci sono alcuni modi:
MySql SPIEGARE
SQL Server SET SHOWPLAN_ALL (Transact-SQL)
Oracle SPIEGARE PIANO

ciò che è spiegare in Teradata?
Teradata Cattura e piani di confrontare velocemente con Visual spiegare e di registrazione piano XML

Altri suggerimenti

A seconda della disponibilità di statistiche e gli indici per le tabelle in questione il meccanismo di riscrittura delle query nel ottimizzatore può o non può optare per Table2 scansione per i record in cui val < 100 prima della scansione Table1.

In alcune situazioni, sulla base di dati demografici dei dati, si unisce, l'indicizzazione e le statistiche si potrebbe scoprire che l'ottimizzatore non sta eliminando record nel piano di query quando si sente che dovrebbe. Anche se si dispone di una tabella derivata come quella nel tuo esempio. È possibile forzare l'ottimizzatore per elaborare una tabella derivata semplicemente mettendo un GROUP BY nella tabella derivata. L'ottimizzatore è quindi obbligato a risolvere il GROUP BY aggregata prima di poter prendere in considerazione la risoluzione del join tra le due tabelle nel tuo esempio.

SELECT table1.id, table3.val
FROM table1
INNER JOIN (
    SELECT table2.id, tabl2.val
    FROM table2
    WHERE val<100
    GROUP BY 1,2
)  table3
ON table1.id=table3.id

Questo non vuol dire che il vostro approccio standard dovrebbe essere quello di correre con questo attraverso il vostro codice. Questo è in genere uno dei miei ultimi villaggi quando ho un piano di query che semplicemente non elimina i record estranei abbastanza in precedenza nel piano e dei risultati in troppi dati da acquisire e portato in giro attraverso le varie file di spool. Questa è semplicemente una tecnica che si può mettere nel vostro toolkit per quando si verifica una situazione del genere.

Il meccanismo di riscrittura delle query viene costantemente aggiornato da una release all'altra ei dettagli su come funziona può essere trovato nel SQL Transaction Processing manuale per Teradata 13.0.

A meno che non mi manca qualcosa, perché ti nemmeno bisogno Table1 ??

Proprio interrogazione Table2

Select id, val  
From table2  
WHERE val<100 

o stai usando le righe in table1 come un filtro? vale a dire, non TABLE1 copntain solo un sottoinsieme degli ID in Table2 ??

Se è così, allora questo lavoro così ...

 Select id, val  
 From table2  
 Where val<100 
   And id In (Select id 
              From table1)

Ma per rispondere alla tua domanda, sì Query Optimizer dovrebbe essere abbastanza intelligente per capire il miglior ordine in cui eseguire i passi necessari per tradurre le istruzioni logiche in un risultato fisico. Esso utilizza le statistiche strored che il database mantiene su ogni tavolo per determinare che cosa fare (che tipo di join logica per l'uso, per esempio), come wekll come quello che al fine di effettuare le operazioni in modo da minimizzare disco obblighi di informazione e costi di lavorazione.

Q1. eseguire la clausola WHERE prima poi unirsi più tardi nella Dichiarazione 1

Il fatto è che, se si passa l'ordine di join interno, vale a dire table2 INNER JOIN tabella1, allora immagino clausola WHERE può essere elaborato prima operazione di join, durante la fase di preparazione. Tuttavia, credo che anche se non si modifica la query originale, l'ottimizzatore dovrebbe essere in grado di cambiare il loro ordine, se si pensa che il join operazione sarà troppo costoso con il recupero tutta la fila, in modo che si applica quando prima. Solo la mia ipotesi.

Q2. Sappiate che tabella 3 non è effettivamente necessario in Statement 2

Teradata interpreterà la vostra seconda query in modo tale che la tabella derivata è necessario, quindi manterrà la lavorazione tabella 3 funzionamento coinvolti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top