webForumDet fria alternativet

Prestandafråga om relationstabeller

5 svar · 540 visningar · startad av Troxy

TroxyMedlem sedan mars 20041 505 inlägg
#1

Hej, här är en prestandafråga om SQL Server 2005, men som kanske gäller SQL i allmänhet.

Jag har två tabeller som har en typisk relation till varandra.
Den ena tabellen innehåller leverantörer, den andra produkter.
De länkas samman med leverantörens ID som är en integer.

Nu vill jag få ut alla leverantörer som har produkter.
Det är enkelt gjort, här är lite olika alternativ hur jag skulle lösa det:

SELECT id, name, address, email ... FROM suppliers WHERE id IN(SELECT DISTINCT supplier FROM products) ORDER BY name
SELECT id, name, address, email ... FROM suppliers AS s WHERE EXISTS(SELECT supplier FROM products WHERE supplier = s.id) ORDER BY name
SELECT s.id, s.name, s.address, s.email ... FROM suppliers s INNER JOIN products p ON s.id = p.supplier
GROUP BY s.id, s.name, s.address, s.email ...
ORDER BY s.name

Men vilken lösning ger bästa prestanda? Då tänker jagfrämst på SQL-frågan men även hur man ska indexera tabellerna.

Tacksam för svar! :)

OveRRidEMedlem sedan feb. 200112 078 inlägg
#2

Troxy skrev:

Hej, här är en prestandafråga om SQL Server 2005, men som kanske gäller SQL i allmänhet.

Jag har två tabeller som har en typisk relation till varandra.
Den ena tabellen innehåller leverantörer, den andra produkter.
De länkas samman med leverantörens ID som är en integer.

Nu vill jag få ut alla leverantörer som har produkter.
Det är enkelt gjort, här är lite olika alternativ hur jag skulle lösa det:

SELECT id, name, address, email ... FROM suppliers WHERE id IN(SELECT DISTINCT supplier FROM products) ORDER BY name
SELECT id, name, address, email ... FROM suppliers AS s WHERE EXISTS(SELECT supplier FROM products WHERE supplier = s.id) ORDER BY name
SELECT s.id, s.name, s.address, s.email ... FROM suppliers s INNER JOIN products p ON s.id = p.supplier
GROUP BY s.id, s.name, s.address, s.email ...
ORDER BY s.name

Men vilken lösning ger bästa prestanda? Då tänker jagfrämst på SQL-frågan men även hur man ska indexera tabellerna.

Tacksam för svar! :)

Jag har hört rykten att i SQL Server 2005 så skall det inte längre spela någon roll om man använder IN eller EXISTS, då EXISTS förut var att föredra av prestandaskäl.

Men i övrigt gissar jag att en JOIN, beroende på lite hur den är utformad, i regel är bättre.

TroxyMedlem sedan mars 20041 505 inlägg
#3

Jag hittade en artikel om just detta.

When you have a choice of using the IN or the EXISTS clause in your Transact-SQL, you will generally want to use the EXISTS clause, as it is usually more efficient and performs faster.

Man får väl utgå ifrån att det stämmer :)

aasahMedlem sedan mars 20034 471 inlägg
#4

Troxy skrev:

Jag hittade en artikel om just detta.

Man får väl utgå ifrån att det stämmer :)

Det låter i och för sig rimligt om frågorna i övrigt är mer eller mindre lika. I princip kan ju datorn alltid sluta leta vid första rad som matchar i en subquery som ska matcha ett exist villkor. Antingen fanns det ju rader eller också inte. Medan en in måste leta tillls den hittar rätt värde. (Och om subquery:n evalueras först, måste den hämta alla matchningar, i det senare fallet.)

Å andra sidan måste det kanske vara stor skillnad om det ska uppväga ifall frågan blir mycket krångligare än med in?

TroxyMedlem sedan mars 20041 505 inlägg
#5

Efter olika tester så har jag kommit fram till att i mitt fall så verkar IN och EXISTS vara snabbast, men just dessa två skiljer sig inte.

OveRRidEMedlem sedan feb. 200112 078 inlägg
#6

Där ser man. :)

260 ms totalt · 3 externa anrop · v20260731065814-full.30151723
134 ms — hämta forumlista (db)
123 ms — hämta statistik (db)
133 ms — hämta tråd, inlägg och bilagor (db)