---
title: "Långsam SQL-fråga"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/173820-långsam-sql-fråga"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "devotion"
published: "2008-09-03T12:34:22.000Z"
updated: "2008-09-04T19:07:44.000Z"
replies: 17
views: 1065
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/173820-långsam-sql-fråga"
---

# Långsam SQL-fråga

## #1 — devotion, 2008-09-03T12:34Z

Hej!

Jag har en SQL-fråga enligt:

```
SELECT TOP 250
    [tblTask].* 
FROM
    (tblTask inner join tblusers
    on
    tbltask.[user] = tblusers.[name])
        inner join tblworkgroups
        on
        tblusers.Groupid = tblworkgroups.id
WHERE
    1=1
    AND
    [tblWorkgroups].[Name]='Sigtuna'
    AND ( 
        ([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
        OR 
        ([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
        OR
        ([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04') 
        OR 
        ([tblTask].[Id] IN 
            ( SELECT [TaskId] FROM [tblTime] WHERE [StopDate]>'2008-09-03' AND [StopDate]<='2008-09-04')
        ) 
    )
```

Denna tar ca 10 sekunder att köra, men om jag tar bort det sista villkoret enligt neadstående kd, tar den mindre än en sekund...

Någon som har en aning?

```
SELECT TOP 250
    [tblTask].* 
FROM
    (tblTask inner join tblusers
    on
    tbltask.[user] = tblusers.[name])
        inner join tblworkgroups
        on
        tblusers.Groupid = tblworkgroups.id
WHERE
    1=1
    AND
    [tblWorkgroups].[Name]='Sigtuna'
    AND ( 
        ([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
        OR 
        ([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
        OR
        ([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04') 
    )
```

Mvh
Henrik

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

## #2 — spango, 2008-09-03T13:41Z

Ja, använder du subqueries måste du köra en fråga/rad från den omslutande frågan. Många frågor blir det. Joins brukar bli snabbare.

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

## #3 — devotion, 2008-09-03T14:53Z

Kan man göra om frågan då, så att man slipper subqueries? :)

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

## #4 — spango, 2008-09-03T15:11Z

Tja, joina in tblTime istället. Det borde la inte vara svårare än de övriga joinsen?

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

## #5 — Peter S, 2008-09-03T15:11Z

Testa

```
SELECT TOP 250
    [tblTask].* 
FROM
    ((tblTask inner join tblusers
    on
    tbltask.[user] = tblusers.[name])
        inner join tblworkgroups
        on
        tblusers.Groupid = tblworkgroups.id)
            left join tblTime
            on
            tbltask.id = tbltime.taskid
WHERE
    1=1
    AND
    [tblWorkgroups].[Name]='Sigtuna'
    AND ( 
        ([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
        OR 
        ([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
        OR
        ([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
        OR
        (tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
    )
```

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

## #6 — devotion, 2008-09-03T22:05Z

Funkish perfectos! :)   

Mvh
Henrik

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

## #7 — devotion, 2008-09-04T17:39Z

Nästan... :(   

När det finns två tider (tblTime) på ett uppdrag, så visas två poster... Jag vill ju bara att det ska visas en post, även att det finns två tidposter som är kopplade....

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

## #8 — Peter S, 2008-09-04T17:47Z

Hur ser resultatraderna ut för posterna?

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

## #9 — devotion, 2008-09-04T18:04Z

De är identiska...

   :)   

Se bild...

Mvh
Henrik

Bilagor:

- [sql.png](https://www.webforum.nu/a/19060.png)

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

## #10 — Peter S, 2008-09-04T18:08Z

Vad bra :)

```
SELECT DISTINCT TOP 250...
```

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

## #11 — devotion, 2008-09-04T18:13Z

hmmmm...

Fel datatyp, typ... :(   

> Msg 421, Level 16, State 1, Line 1
> Det går inte att markera datatypen text som DISTINCT eftersom den inte är jämförbar.
> Msg 421, Level 16, State 1, Line 1
> Det går inte att markera datatypen text som DISTINCT eftersom den inte är jämförbar.
> Msg 421, Level 16, State 1, Line 1
> Det går inte att markera datatypen text som DISTINCT eftersom den inte är jämförbar.
> Msg 421, Level 16, State 1, Line 1
> Det går inte att markera datatypen text som DISTINCT eftersom den inte är jämförbar.

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

## #12 — Peter S, 2008-09-04T18:14Z

Byt datatypen till varchar(max).

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

## #13 — devotion, 2008-09-04T18:16Z

Om jag inte kan det?

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

## #14 — Peter S, 2008-09-04T18:19Z

Då blir det jobbigt :)

Ett hett tips till framtiden är att välja varchar(max) i stället för text och nvarchar(max) i stället för ntext. Då kan coola saker som DISTINCT, GROUP BY och strängfunktioner användas.

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

## #15 — spango, 2008-09-04T18:19Z

Borde gå att kirra med en COUNT också. Skjuter från höften på halt vatten här men typ:

```
SELECT TOP 250
    [tblTask].* 
FROM
    ((tblTask inner join tblusers
    on
    tbltask.[user] = tblusers.[name])
        inner join tblworkgroups
        on
        tblusers.Groupid = tblworkgroups.id)
            left join tblTime
            on
            tbltask.id = tbltime.taskid
WHERE
    [tblWorkgroups].[Name]='Sigtuna'
    AND ( 
        ([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
        OR 
        ([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
        OR
        ([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
        OR
        (tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
HAVING COUNT(tbltime.*) > 0
GROUP BY tbltask.*
```

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

## #16 — devotion, 2008-09-04T18:41Z

> **spango skrev:**
>
> Borde gå att kirra med en COUNT också. Skjuter från höften på halt vatten här men typ:
>
>
> ```
> SELECT TOP 250
>     [tblTask].* 
> FROM
>     ((tblTask inner join tblusers
>     on
>     tbltask.[user] = tblusers.[name])
>         inner join tblworkgroups
>         on
>         tblusers.Groupid = tblworkgroups.id)
>             left join tblTime
>             on
>             tbltask.id = tbltime.taskid
> WHERE
>     [tblWorkgroups].[Name]='Sigtuna'
>     AND ( 
>         ([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
>         OR 
>         ([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
>         OR
>         ([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
>         OR
>         (tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
> HAVING COUNT(tbltime.*) > 0
> GROUP BY tbltask.*
> ```

Nä, det funkar inte...

Hur många tecken rymmer en Varchar(max) och hur mycket rymmer text? Vad är skillnaden i prestanda, att använda varchar(max) istället för text?

Mvh
Henrik

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

## #17 — Peter S, 2008-09-04T18:53Z

Text och ntext är på väg att fasas ut till förmån för varchar-motsvarigheterna. Det borde räcka ;)

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

## #18 — devotion, 2008-09-04T19:07Z

Ja, jag sökte lite och hittade den informationen...

Tex:
<http://www.teratrax.com/articles/varchar_max.html>

Mvh
Henrik

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/173820-långsam-sql-fråga
