2013-03-27 14 views
10

Vorrei sapere qual è il migliore per quanto riguarda le prestazioni tra le 2 query indicate di seguito o eseguono in modo identico?Prestazioni di query INTERNA JOIN ON E confronto

Prima uno: [senza clausola WHERE, giusta e con ON]

SELECT related_tabid AS tabid, label, t.name 
    FROM relatedlists r 
    INNER JOIN tab t 
     ON t.tabid = r.tabid 
      AND t.name = 'Leads' 
      AND r.is_active=1 and r.related_tabid <> 0 
      AND t.is_active=1 
    ORDER BY label 

seconda: [usando clausola WHERE, e associati dove al posto di ON]

SELECT related_tabid AS tabid, label, t.name 
    FROM relatedlists r 
    INNER JOIN tab t 
     ON t.tabid = r.tabid 
     WHERE t.name = 'Leads' 
      AND r.is_active=1 and r.related_tabid <> 0 
      AND t.is_active=1 
    ORDER BY label 

risposta

5

Entrambe le query sono uguali perché il join utilizzato è INNER JOIN. INNER JOIN fondamentalmente filtra solo le righe che hanno almeno una corrispondenza sull'altra tabella. Anche le due tabelle sono interscambiabili, il risultato è sempre lo stesso.

Ma se vi state unendo tramite LEFT JOIN, le due query sono diverse l'una dall'altra e produrranno risultati diversi.

+0

grazie per la vostra risposta. se uso 'LEFT JOIN' quale sarà più veloce nelle prestazioni? – Rashidul

+0

un buon articolo per la tua domanda: [INNER JOIN vs LEFT JOIN performance] (http://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server) –

1

Mi sembra che l'unica differenza tra le due query è che uno ha il t.name = 'Leads' nella clausola WHERE e ce l'ha nella clausola JOIN. Corretta?

Non c'è differenza tra i due. L'ottimizzatore SQL gestirà entrambi in modo identico. Fai una SPIEGA su ognuno di essi per verificare.

+0

sì, entrambi sono uguali. Grazie – Rashidul

0

In teoria, la prima query è semplicemente voler mettere il confronto del testo nel "dove", quindi si unisce alla definizione della "logica" dell'unione delle tabelle e il "dove" è usato solo per specificare i valori che variano quando si confrontano Dove t.name = 'Leads'; saluti