Archief - sql : INNER JOIN versus meerdere tabellen via WHERE

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

servi

Legacy Member
Ik heb hier 2 queries die identiek hetzelfde doen :

query 1 :
Code:
 SELECT a.id, a.titel, a.tekst, b.naam, b.typecat, c.naam, a.ncommentaren
FROM nieuws a, categorie b, gebruiker c
WHERE a.catid = b.id AND a.posterid = c.id AND b.zichtbaar =1
LIMIT 0 , 30

query 2 :
Code:
 SELECT a.id,a.titel,a.tekst,b.naam,b.typecat,c.naam,a.ncommentaren FROM nieuws a 
 JOIN categorie b ON a.catid = b.id
 JOIN gebruiker c ON a.posterid = c.id
 WHERE b.zichtbaar = 1
 LIMIT 0,30

Mijn vraag is nu echter : wat valt er te prefereren en waarom ?
Mijn gevoel zegt met dat ik beter af ben met een JOIN, maar ik weet het liever zeker. welke van de 2 is het meeste performanste ?

sys4096

Legacy Member
Het performantste weet ik zo direkt niet, maar wel dat de eerste oplossing compatibeler is dan de 2e. Niet elke database ondersteunt een JOIN

dJeez

Legacy Member
Dat hangt grotendeels van de optimalisaties van het gebruikte RDBMS af, testen is dus de boodschap (maar dan wel met verschillende parameters want anders ga je caching in de hand werken en vertekende resultaten krijgen).

Persoonlijk zou 'k die b.zichtbaar trouwens al meenemen in de eerste join, maw :
SELECT a.id,a.titel,a.tekst,b.naam,b.typecat,c.naam,a.ncommentaren FROM nieuws a
JOIN categorie b ON a.catid = b.id AND b.zichtbaar = 1
JOIN gebruiker c ON a.posterid = c.id
LIMIT 0,30

DarkBone

Legacy Member
In de mysql manual staat dat je bij joins, de beperkende condities die op een bepaalde join tss twee tabellen slaat, bijvoorkeur moet plaatsen in de ON-clausule.

Situatie 2 valt dus tep prefereren.

servi

Legacy Member
Bedankt iedereen.

Hier ben ik al wijzer uit geworden. Ik had al gedacht aan een benchmark, maar het probleem is dat ik nog maar bezig ben met mijn database-layout te ontwerpen en ik dus absoluut geen data had om dit uitvoerig te testen.

het zal dus de 2de methode worden :)

dJeez

Legacy Member
BTW Servi, aangezien je daar spreekt over je databaselayout en je blijkbaar toch MySQL gebruikt, ken je DBDesigner al?

Ondanks de bugs die er in zitten vind 'k het toch een heel handig tooltje...

sys4096

Legacy Member
Hevia zei:
Welke dan niet?

bv Oracle 8 (dacht dat de 9 het wel kon...)

Oracle does not support JOIN or OUTER JOIN expressions, either stand-alone or in FROM clauses. Instead, outerjoins are supported by a special operator "(+)" in WHERE clauses. For example, suppose that we have relations R(A, B) and S(C, D). Then,

R left outer join S on R.B = S.C;
R right outer join S on R.B = S.C;

can be rewritten as:

select * from R, S where R.B = S.C(+);
select * from R, S where R.B(+) = S.C;

respectively. Basically, "(+)" next to a column means that this column can be padded with NULL's in the outerjoin result. Unfortunately, you cannot use "(+)" on both sides of the equality to write a full outerjoin. Also, you cannot outerjoin the same table to more than one other table in a single SELECT statement.
link

Het kan ook dikwijls van de driver afhangen of hij het al dan niet aankan.

Lashknife

Legacy Member
persoonlijk vind ik zo een where a.value = b.value veel eenvoudiger en duidelijker dan al die join syntax dingen....

ma soit, heb ook nog nooit performantie gerichte dingen moeten creëren (waarvoor ik om te beginnen al rekening zou moeten houden met foreign keys enzo en da doe ik al ni voor mysql :p )

eigenlijk ben ik wel slecht bezig, maar op - zoals gezegd - simpel niveau is da ook ni zo van belang

servi

Legacy Member
BTW Servi, aangezien je daar spreekt over je databaselayout en je blijkbaar toch MySQL gebruikt, ken je DBDesigner al?

Ondanks de bugs die er in zitten vind 'k het toch een heel handig tooltje...

Juist eens gedownload en het is inderdaad , ondanks de vele bugs ;), iets handig :niceone: ( en veel gemakkelijker dan op papier te tekenen)

persoonlijk vind ik zo een where a.value = b.value veel eenvoudiger en duidelijker dan al die join syntax dingen....


Het is inderdaad gek, vroeger vond ik zo'n statement gemakkelijker, maar nu vind ik met join-syntax precies eenvoudiger.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan