2012-06-14 8 views
7

Esiste un significato nell'ordine della tabella nell'istruzione sql join. Per esempioEsiste un significato nell'ordine della tabella nell'istruzione sql join

SELECT dept_name, emp_name 
FROM Employee 
INNER JOIN Department ON Employee.dept_id = Department.dept_id 

e

SELECT dept_name, emp_name 
FROM Department 
INNER JOIN Employee ON Employee.dept_id = Department.dept_id 

è che non c'è alcun vantaggio delle prestazioni nell'ordine dei tavoli?

risposta

9

No, non c'è.

La maggior parte (se non tutti) l'uso del DBMS di un ottimizzatore basato sui costi. L'ordine in cui vengono specificate le dichiarazioni non influisce sulla velocità di esecuzione.

Oracle SQL cost based optimization

ottimizzatore SQL basato sui costi di Oracle (CBO) è estremamente sofisticata componente di Oracle che governa l'esecuzione per ogni query Oracle. Il CBO si è evoluto in uno dei componenti software più sofisticati del mondo e ha il compito stimolante di valutare qualsiasi istruzione SQL e generare il piano di esecuzione "migliore" per l'istruzione .

Entrambi gli estratti conto generano lo stesso piano esecuzione e quindi hanno le stesse caratteristiche perfomance. Si noti che il costo sarà basato sulle statistiche disponibili. Le statistiche aggiornate sono molto importanti affinché l'ottimizzatore sia in grado di generare il piano di esecuzione più efficiente.

+1

+1. Vorrei aggiungere (solo per fare il pasticcio) che le due istruzioni dovrebbero generare lo stesso piano di esecuzione, * tutto il resto è uguale * (cioè analizzato all'incirca nello stesso momento, con le stesse statistiche di tabella, ecc.). Ci sono circostanze (fuori dallo scopo di questa domanda) in cui le due domande potrebbero sembrare dare piani diversi. –

0

No. L'ottimizzatore calcola il miglior percorso di join, o almeno quello che ritiene sia il miglior percorso di join. In situazioni insolite, a volte non ha tutte le informazioni di cui ha bisogno, ma il 99% delle volte andrà bene. Risolverà internamente anche l'istruzione SQL in altri modi.

1

L'ottimizzatore controlla tutte le possibili permutazioni di ordine di join e prende quello con il valore di costo più basso. Ciò significa che l'ottimizzazione stessa, preparando la dichiarazione, diventa un collo di bottiglia per affermazioni complesse. Più tabelle si uniscono, più varianti del piano di esecuzione vengono controllate matematicamente: n! (Fattoriale).

fonte: http://use-the-index-luke.com/sql/join

-1

come altri anwsers dice, no.
ma pensa se è possibile sostituire alcuni join interni con join di sinistra. nella maggior parte dei querys questo è un beneficio in termini di prestazioni

+0

In realtà, lo fai all'indietro. Un'unione interna in genere ha prestazioni migliori rispetto a un'unione esterna. – Allan

5

In generale, non importa. L'ottimizzatore dovrebbe essere in grado di individuare l'ordine più efficiente in cui unire le tabelle indipendentemente dall'ordine in cui appaiono nella query.

È tuttavia possibile che l'ordine delle tabelle influenzi il piano di query. Questo in genere non sarebbe il caso se si ha un semplice join a due tabelle, ma con l'aumentare del numero di tabelle in una query, il numero di join possibili aumenta ad una velocità O (n!). Abbastanza rapidamente, diventa impossibile per l'ottimizzatore prendere in considerazione tutti gli ordini di join possibili, quindi deve utilizzare varie euristiche per potare l'albero. Ciò, a sua volta, porta a situazioni in cui l'ottimizzatore sceglie una tabella di guida diversa se quella tabella viene elencata per prima nell'istruzione SQL anziché quando quella tabella è la decima tabella nella query. Jonathan Lewis ha un bel post sul blog che mostra come the order tables appear in a query can affect the query plan.Se vuoi essere più attento, elencare il tavolo da guida prima è una cosa ragionevole da fare-- non sarà di grande aiuto, ma potrebbe occasionalmente fare qualcosa di buono.

+0

+1 Ho pensato di menzionare qualcosa riguardo a questo nella mia risposta, ma non ho potuto scriverlo in modo semplice come hai fatto tu e per la maggior parte degli intenti e degli scopi, le probabilità sono magre che una persona potrebbe mai essere morsa da essa. –

+0

Mi sono imbattuto in una situazione in cui avevo un tavolo con righe di 1,5 milioni unite a 4 altri tavoli con ~ 50k righe ciascuno. L'ordine dei join ha avuto un chiaro impatto con le query che richiedono> 30 secondi in alcuni ordini, ~ .01 secondi in altri. –

Problemi correlati