Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sapere se esiste un record

915 views
Skip to first unread message

D.

unread,
Dec 17, 2008, 11:06:56 AM12/17/08
to
Ciao a tutti,
mi chiedevo, dal punto di vista delle prestazioni, quale sia il modo più
rapido per verificare se esista almeno un record con determinate
caratteristiche.

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.


Albe V°

unread,
Dec 17, 2008, 11:03:39 AM12/17/08
to
Sembra che D. abbia detto :

Cavolo, il mio esame di stato...

1994...

Alberto

--
Léo Campion: Il lavoro è l'occupazione di chi non ha nulla da fare.


Luca Bianchi

unread,
Dec 18, 2008, 3:20:43 AM12/18/08
to
> mi chiedevo, dal punto di vista delle prestazioni, quale sia il modo più
> rapido per verificare se esista almeno un record con determinate
> caratteristiche.

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

D.

unread,
Dec 18, 2008, 11:27:40 AM12/18/08
to
Ti ringrazio per l'esauriente risposta.

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.

Luca Bianchi

unread,
Dec 18, 2008, 11:44:05 AM12/18/08
to
> 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'

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

D.

unread,
Dec 19, 2008, 4:04:01 AM12/19/08
to
Perfetto ti ringrazio.
0 new messages