Per es.
Supponiamo di avere una tabella con 1 milione di clienti.
Qual'è la query più rapida per sapere se esiste almeno un cliente che abita
in provincia di Milano?
E ancora... se il campo da ricercare fosse una primary key (per es. voglio
sapere se esiste il cliente con codice '00001') la query ottimale sarebbe
sempre la stessa?
Grazie e ciao,
D.
Cavolo, il mio esame di stato...
1994...
Alberto
--
Léo Campion: Il lavoro è l'occupazione di chi non ha nulla da fare.
Ovviamente facendo una query come faresti per qualunque altra attività. Sono
sicuro che fai il possibile per rendere la query (qualsiasi) il più
efficiente possibile ed anche la sola verifica di esistenza non si sottrae a
questa regola.
> Supponiamo di avere una tabella con 1 milione di clienti.
> Qual'è la query più rapida per sapere se esiste almeno un cliente che
> abita in provincia di Milano?
Qualunque siano le dimensioni della tabella sono sicuro che non la
scriveresti come
SELECT campi
FROM tabella
WHERE prov LIKE '%Milano%'
ma piuttosto come
SELECT campi
FROM tabella
WHERE prov = 'Milano'
Visto che a te interessa solo sapere o meno dell'esistenza di un record
risulta più efficiente scrivere qualcosa di simile a
IF EXISTS (query)
che non eseguire la query è testare la @@rowcount. L'uso dell'EXISTS,
infatti, interrompe il processamento della query nel momento in cui viene
trovato un record che soddisfa la condizione...
> E ancora... se il campo da ricercare fosse una primary key (per es. voglio
> sapere se esiste il cliente con codice '00001') la query ottimale sarebbe
> sempre la stessa?
Ovvio che si... è evidente che se c'è un indice (e questo è ritenuto
efficiente) SQL Server lo utilizza e se non c'è deve procedere ad un table
scan... ma questo vale sia per la verifica di esistenza che per una query di
restituzione dati...
> Grazie e ciao,
> D.
Bye
--
Luca Bianchi
Microsoft MVP - SQL Server
http://community.ugiss.org/blogs/lbianchi
Quindi secondo te una query di questo tipo:
select 1 where EXISTS (select * from clienti where provincia = 'MI')
equivale in termini di performance ad una query di questo tipo:
select top(1) id from clienti where provincia= 'MI'
Non sono però riuscito, a sviluppare una query che restituisce un resultset
di una riga e una colonna ,costituito da un campo bit che contiene 1 se
esiste almeno un record (cioè esiste almeno un cliente in prov. di Milano) e
0 se non esiste nessun record.
Secondo te è possibile?
Grazie e ciao,
D.
La query qui sopra è sbagliata da un punto di vista concettuale. Da un punto
di vista logico dire "restituiscimi il primo record" è una richiesta
incompleta. Il primo in base a che cosa...?!? Ecco li che la TOP senza un
criterio di ordinamento è un qualcosa che resta incompleto.
Poi SQL Server è sufficientemente intelligente per dire "...ok... questo qui
voleva sapere solo il primo record e quindi una volta trovato è inutile che
vado avanti a cercare gli altri". Resta il fatto che con una verifica di
esistenza viene restituito un TRUE/FALSE mentre nel tuo esempio viene
restituito il contenuto di un campo
> Non sono però riuscito, a sviluppare una query che restituisce un
> resultset di una riga e una colonna ,costituito da un campo bit che
> contiene 1 se esiste almeno un record (cioè esiste almeno un cliente in
> prov. di Milano) e 0 se non esiste nessun record.
> Secondo te è possibile?
IF EXISTS (query)
SELECT 1
ELSE
SELECT 0