/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
EXISTS eller IN
Fra : Dcasso


Dato : 23-10-02 17:23

Hej

Jeg sidder med en simpel access-db jeg bruger op mod et VB program,
jeg er dog stødt på en ting som undrer mig meget.

Hvad er forskellen på IN og EXISTS, har simpelthen ikke kunnet finde
et fornuftigt svar. En har fortalt mig at EXISTS er hurtigere, men
vidste ikke hvorfor m.v.

Så er der lige en ekspert herinde der gider bruge et minut eller to på
at fortælle mig det.

mvh
Dennis

 
 
Tomas Christiansen (23-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 23-10-02 20:01

Dcasso skrev:
> Hvad er forskellen på IN og EXISTS, har simpelthen ikke kunnet finde
> et fornuftigt svar. En har fortalt mig at EXISTS er hurtigere, men
> vidste ikke hvorfor m.v.

Det er da vist SQL du spørger om. Det har intet med VB at gøre!

Men lad mig nu alligevel give et svar:

IN bruges til at angive en liste af værdier, fremfor at skulle gentage
en del af udtrykket hver gang. Følgende to udtryk er ækvivalente:
((x=a) or (x=b) or (x=c) or (x=d))
(x IN (a,b,c,d))

EXISTS bruges til at undersøge om et SQL-udtræk vil finde nogle
poster. Man skrive altså et normalt udtryk på formen "select ... from
.... where ... osv" om sætter det ind imellem parenteserne i EXISTS().
Hvis SELECT-sætningen fandt én eller flere poster, giver EXIST værdien
sand og ellers FALSK.

Helt generelt vil jeg i den grad mene at EIXTS kan være med at give
_virkelig_ dårlig performance!

Forestil dig følgende:
SELECT a.b
FROM b
WHERE EXISTS(SELECT *
FROM <rigtig mange tabeller>
WHERE <ekstremt stort udtryk>)

Hvis tabellen b indeholder 1.000.000 poster, skal udtrykket i EXISTS
udføres 1.000.000 gange - og det tager tid!!!

Jeg ved ikke lige hvordan man direkte skal kunne sammenligne IN og
EXISTS.
Det er vel lidt som at sammenligne rejer og æbler: De er begge
spiselige, men på hver deres måde. Skal lave æblegrød duer det ikke
med rejer, og man kan ikke erstatte rejerne i rejesalaten med æbler.

-------
Tomas


Peter Lykkegaard (23-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 23-10-02 20:28

Som svar på skriblerier forfattet af Tomas Christiansen

> Dcasso skrev:
>> Hvad er forskellen på IN og EXISTS, har simpelthen ikke kunnet finde
>> et fornuftigt svar. En har fortalt mig at EXISTS er hurtigere, men
>> vidste ikke hvorfor m.v.
>
> Helt generelt vil jeg i den grad mene at EIXTS kan være med at give
> _virkelig_ dårlig performance!
>
Depends
IF EXISTS (SELECT foo.b FROM foo WHERE foo.id = 12)
-- add new record

Er almindelig udbredt brug af EXISTS

EXISTS breaker første gang betingelsen er opfyldt , i modsætning til IN der
henter alle poster der opfylder betingelsen

> Forestil dig følgende:
> SELECT a.b
> FROM b
> WHERE EXISTS(SELECT *
> FROM <rigtig mange tabeller>
> WHERE <ekstremt stort udtryk>)
>
> Hvis tabellen b indeholder 1.000.000 poster, skal udtrykket i EXISTS
> udføres 1.000.000 gange - og det tager tid!!!

Er det ikke et _meget_ tænkt eksempel

mvh/Peter Lykkegaard



Tomas Christiansen (23-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 23-10-02 21:20

Peter Lykkegaard skrev:
> > Hvis tabellen b indeholder 1.000.000 poster, skal udtrykket i
EXISTS
> > udføres 1.000.000 gange - og det tager tid!!!
>
> Er det ikke et _meget_ tænkt eksempel

Ikke mere tænkt end at der i noget af Oracles dokumentation advares om
konsekvenserne af brugen af EXISTS - netop fordi udtrykket bliver
udført for _hver_ funden post. Jeg har selv lidt dårlige erfaringer
med udtryk, hvor jeg har haft brug for adskillige EXISTS i samme
sætning - det performer ikke godt!

-------
Tomas


Peter Lykkegaard (23-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 23-10-02 22:16

Som svar på skriblerier forfattet af Tomas Christiansen

> Peter Lykkegaard skrev:
>>> Hvis tabellen b indeholder 1.000.000 poster, skal udtrykket i
> EXISTS
>>> udføres 1.000.000 gange - og det tager tid!!!
>>
>> Er det ikke et _meget_ tænkt eksempel
>
> Ikke mere tænkt end at der i noget af Oracles dokumentation advares om
> konsekvenserne af brugen af EXISTS - netop fordi udtrykket bliver
> udført for _hver_ funden post. Jeg har selv lidt dårlige erfaringer
> med udtryk, hvor jeg har haft brug for adskillige EXISTS i samme
> sætning - det performer ikke godt!
>
Hmm på MSSQL er det lige omvendt her returnere EXISTS hurtigere end IN ved
sammenlignelige queries netop fordi den returnere True if _any_ records
opfylder et kriterie

Så vidt jeg kan forstå på dokumentationen til MSSQL så afbryder den hvis den
finder een record der opfylder det valgte kriterie

SELECT foo.a
FROM foo
WHERE EXISTS
(SELECT *
FROM bar
WHERE foo.y = bar.y
AND foo.z = bar.z)

Giver 49.63% af en samlet batch

SELECT foo.a
FROM foo
WHERE foo.b IN
(SELECT bar.b
FROM bar
WHERE foo.y = bar.y
AND foo.z = bar.z)

Giver 50.37% af en samlet batch

Der muligvis andre eksempler der giver andre resultater

mvh/Peter Lykkegaard



Tomas Christiansen (24-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 24-10-02 07:44

Peter Lykkegaard skrev:
> Hmm på MSSQL er det lige omvendt her returnere EXISTS hurtigere end
IN ved
> sammenlignelige queries netop fordi den returnere True if _any_
records
> opfylder et kriterie

Problemet er at jeg inde i mit hovede ikke kunne fravige fra tanken om
den statiske liste af værdier, som man i SQL-kan bruge IN til.

Altså formen:
SELECT * FROM x
WHERE x IN (1, 2, 5, 7);

Som jo naturligvis altid vil være meget hurtigt, idet det ikke kræver
flere opslag pr. funden post.

Du har helt ret i dine iagtagelser vedrørende den brug af IN og EXISTS
som du har afprøvet, og som formentlig også var det som Dcasso
oprindelig spurgte om.

-------
Tomas


Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste