2013-05-03 20 views
33

stavo solo mettere in ordine un po 'di sql quando mi sono imbattuto in questa domanda:L'ordine Sql JOIN influisce sulle prestazioni?

SELECT 
     jm.IMEI , 
     jm.MaxSpeedKM , 
     jm.MaxAccel , 
     jm.MaxDeccel , 
     jm.JourneyMaxLeft , 
     jm.JourneyMaxRight , 
     jm.DistanceKM , 
     jm.IdleTimeSeconds , 
     jm.WebUserJourneyId , 
     jm.lifetime_odo_metres , 
     jm.[Descriptor] 
FROM dbo.Reporting_WebUsers AS wu WITH (NOLOCK) 
     INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId 
     INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId 
WHERE (wu.isActive = 1) 
     AND (j.JourneyDuration > 2) 
     AND (j.JourneyDuration < 1000) 
     AND (j.JourneyDistance > 0) 

La mia domanda è se vi sia differenza di prestazioni l'ordine del si unisce, come per la query di cui sopra avrei fatto

FROM dbo.Reporting_JourneyMaster90 AS jm 

e quindi unito gli altri 2 tavoli a quello

+0

Provare a eseguire entrambi e visualizzare i piani di esecuzione. Sono diversi? Non mi aspetterei che lo siano. –

+0

Non l'ho mai sentito dire che influisce sulle prestazioni. –

+0

Se una query così semplice è lenta, suppongo che sia necessario esaminare l'indicizzazione. – HLGEM

risposta

27

No, il JOIN in base all'ordine viene modificato durante l'ottimizzazione.

L'unica avvertenza è l'opzione FORCE ORDER che imporrà che i join si verifichino nell'ordine esatto in cui li hai specificati.

+0

Ho appena avuto un esempio che usa MySQL dove è importante, perché stavo ordinando una data che era stata aggiunta da un'altra tabella. La modifica dell'ordine ha ridotto il tempo di esecuzione del 20%. E poi, aggiungendo il paging, ha ridotto i tempi di esecuzione dell'80%. Quindi penso che dipenda. – smerlung

4

Normalmente no. Non sono al 100% questo si applica letteralmente a Sql-Server, ma in Postgres il pianificatore di query si riserva il diritto di riordinare i join interni come meglio crede. L'eccezione è quando raggiungi una soglia oltre la quale è troppo costoso indagare sulla modifica del loro ordine.

5

JOIN ordine non importa, il motore di query riorganizzerà il loro ordine in base alle statistiche per gli indici e altre cose.

Per prova di effettuare le seguenti operazioni:

  • selezionare Mostra piano di esecuzione effettiva ed eseguire prima query
  • cambiamento JOIN ordine ed eseguire la query di nuovo
  • confrontare piani di esecuzione

Ora dovrebbe essere identico poiché il motore di query li riorganizzerà in base ad altri fattori.

Come commentato da altri utenti, è possibile utilizzare OPTION (FORCE ORDER) per utilizzare esattamente l'ordine desiderato ma potrebbe non essere il più efficiente.

COME una regola generale, l'ordine JOIN dovrebbe essere con la tabella dei record minimi in alto, e la maggior parte dei record durerà, poiché alcuni motori DBMS l'ordine può fare la differenza, così come se il comando FORCE ORDER è stato utilizzato per aiuta a limitare i risultati.

-5

Sbagliato. SQL Server 2005 è sicuramente importante poiché si limita il set di dati dall'inizio della clausola FROM. Se inizi con 2000 record invece di 2 milioni, la tua query sarà più veloce.

29

Unire l'ordine nel server SQL2008R2 incide indiscutibilmente sulle prestazioni della query, in particolare nelle query in cui è presente un numero elevato di join tabella con clausole where applicate a più tabelle.

Sebbene l'ordine di join venga modificato in ottimizzazione, l'ottimizzatore non tenta tutti gli ordini di join possibili. Si ferma quando trova quella che considera una soluzione praticabile poiché l'atto stesso dell'ottimizzazione utilizza risorse preziose.

Abbiamo visto query che si stavano comportando come cani (1min + tempo di esecuzione) scendono al secondo sotto la performance semplicemente cambiando l'ordine delle espressioni di join. Si noti, tuttavia, che si tratta di query con 12-20 join e clausole su più tabelle.

Il trucco è impostare il tuo ordine per aiutare l'ottimizzatore di query a capire cosa ha senso. Puoi usare l'ordine forzato ma può essere troppo rigido. Cerca di assicurarti che l'ordine di partecipazione inizi con le tabelle in cui ridurrà i dati più attraverso le clausole.

+2

Ho lavorato con SQL server per oltre 10 anni e per la prima volta ho iniziato a vedere l'ordine JOIN influenzare le prestazioni come indicato in questa risposta. Sconcertato, avendo pensato che l'ottimizzatore fosse al meglio, mi sono imbattuto in questo mentre cercavo altri che avevano visto lo stesso comportamento. Sì, le mie statistiche sono tutte aggiornate. –

+3

Questo potrebbe anche essere un problema di snifing dei parametri, in cui qualsiasi modifica alla query avrebbe migliorato le cose. –

+5

@TomTom Anche il libro di ottimizzazione basato sul costo di Grant Fritchey parla di questi scenari specifici in cui "l'ottimizzatore si arrende" su query complesse. È persino in grado di dimostrarlo utilizzando il DB dimostrativo di Microsoft. –

8

Ho un chiaro esempio di inner join che influisce sulle prestazioni. È un semplice join tra due tavoli. Uno aveva oltre 50 milioni di dischi, l'altro ne ha 2.000. Se seleziono dal tavolo più piccolo e ci unisco più grande ci vogliono più di 5 minuti.

Se seleziono dalla tabella più grande e unisco il più piccolo ci vogliono 2 minuti e 30 secondi.

Questo è con SQL Server 2012.

Per me questo è contro intuitivo dato che sto usando il più grande set di dati per la query iniziale.

+11

Migliorerebbe la tua risposta se potessi mostrare i piani di esecuzione per entrambi gli scenari – PeterVermont

+1

Bene, forse la clausola where limita la tabella grande in un piccolo insieme mentre non può ridurre la tabella più piccola? – user2173353

Problemi correlati