---
title: "Prestandafråga om relationstabeller"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/167836-prestandafråga-om-relationstabeller"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Troxy"
published: "2008-01-06T20:17:06.000Z"
updated: "2008-01-14T08:35:47.000Z"
replies: 5
views: 572
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/167836-prestandafråga-om-relationstabeller"
---

# Prestandafråga om relationstabeller

## #1 — Troxy, 2008-01-06T20:17Z

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!  :)

Permalänk: https://www.webforum.nu/p/167836

## #2 — OveRRidE, 2008-01-06T20:42Z

> **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.

Permalänk: https://www.webforum.nu/p/2068403

## #3 — Troxy, 2008-01-07T23:37Z

[Jag hittade en artikel om just detta](http://www.sql-server-performance.com/tips/t_sql_where_p3.aspx).

> 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 :)

Permalänk: https://www.webforum.nu/p/2068711

## #4 — aasah, 2008-01-08T00:20Z

> **Troxy skrev:**
>
> [Jag hittade en artikel om just detta](http://www.sql-server-performance.com/tips/t_sql_where_p3.aspx).
> 
> 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?

Permalänk: https://www.webforum.nu/p/2068714

## #5 — Troxy, 2008-01-09T22:16Z

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.

Permalänk: https://www.webforum.nu/p/2069220

## #6 — OveRRidE, 2008-01-14T08:35Z

Där ser man. :)

Permalänk: https://www.webforum.nu/p/2070212

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/167836-prestandafråga-om-relationstabeller
