2010-07-30 11 views
7

whos potrebbe essere molto efficace se uso nestted subquery, JOINs O forse temp tables .. un'altra domanda: in sottoquery se io uso nella clausola due volte con la stessa query si deve eseguire un doppio troppo!? in questo modo:di query nidificate vs unisce

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

quante volte il sub-query SELECT * FROM Y potrebbe essere eseguito in questa query!
e che cosa se uso questo modo per farlo:

With XX As 
(
Select ... 
From Y 
) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

thanx :)

risposta

4

Le due interrogazioni sono equivalenti, e dovrebbero produrre piani identici. È un equivoco che le CTE vengano compilate una sola volta, fornendo un vantaggio in termini di prestazioni. Le CTE non ricorsive sono solo zucchero sintattico per tabelle derivate/viste in linea (IMO erroneamente definito subquery).

In secondo luogo, JOINs vs IN/EXISTS possono produrre risultati diversi. Le JOIN rischiano dati duplicati, se esistono due o più record di supporto. EXISTS viene utilizzato al meglio se esistono criteri duplicati, poiché restituisce true al primo incontro dei criteri, rendendolo potenzialmente più veloce di IN o JOIN. Non c'è alcun rischio di duplicazione dei dati quando si utilizzano EXISTS o IN.

+0

grazie mille amico :) – Rawhi

0

Unisce sono di gran lunga più veloce rispetto agli altri suggerimenti che hai fatto.

I join eseguiranno la condizione ON per ogni record mentre il doing select con un WHERE attiverà prima tutti i record, quindi eseguirà il filtro, quindi sarà molto più lento.

Unisce tutto !!

+0

ma se dovessi usare distinto con esso, non sarà ancora veloce quanto gli altri .. giusto? – Rawhi

+0

@Paul Maledizioni, mi hai battuto. –

+0

AHA ....... !!!! – Rawhi

2

Utilizzare il piano di esecuzione in SQL Server Management Studio e vedere di persona ciò che viene eseguito più rapidamente rispetto al database.

+0

ho provato a scaricarlo, ma ho fallito hh !! – Rawhi

+0

La versione rapida è facilmente disponibile e di solito funziona: http: // www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en –

2

In primo luogo, la sintassi è probabilmente incorrect.Thus, i due formati sarà simile:

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
    Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

E

With XX As 
    (
    Select ... 
    From Y 
    ) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
    Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

Annotare la Exists dichiarazioni. Non sono Where Col Exists(... ma invece sono solo Where Exists(....

In secondo luogo, l'efficienza e la velocità dipenderanno dai dati, dalle statistiche, dagli indici e, alla fine della giornata, da cosa l'ottimizzatore è in grado di rendere più efficiente. Pertanto, è davvero necessario esaminare il piano di esecuzione per sapere quale è più veloce. Ora, un'altra forma potrebbe essere:

Select ... 
From X 
Where Exists (
       Select 1 
       From Y 
       Where Idx = Y.SomeColumn 
       Union All 
       Select 1 
       From Y 
       Where Idy = Y.SomeColumn 
       ) 
+0

grazie .......: D – Rawhi