webForumDet fria alternativet

Långsam SQL-fråga

17 svar · 1 057 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

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

spangoMedlem sedan juni 20008 205 inlägg
#2

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.

devotionMedlem sedan jan. 20013 582 inlägg
#3

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

spangoMedlem sedan juni 20008 205 inlägg
#4

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

Peter SMedlem sedan dec. 20025 483 inlägg
#5

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')
    )
devotionMedlem sedan jan. 20013 582 inlägg
#6

Funkish perfectos! :)

Mvh
Henrik

devotionMedlem sedan jan. 20013 582 inlägg
#7

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

Peter SMedlem sedan dec. 20025 483 inlägg
#8

Hur ser resultatraderna ut för posterna?

devotionMedlem sedan jan. 20013 582 inlägg
#9

De är identiska...

:)

Se bild...

Mvh
Henrik

sql.png
Peter SMedlem sedan dec. 20025 483 inlägg
#10

Vad bra :)

SELECT DISTINCT TOP 250...
devotionMedlem sedan jan. 20013 582 inlägg
#11

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.

Peter SMedlem sedan dec. 20025 483 inlägg
#12

Byt datatypen till varchar(max).

devotionMedlem sedan jan. 20013 582 inlägg
#13

Om jag inte kan det?

Peter SMedlem sedan dec. 20025 483 inlägg
#14

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.

spangoMedlem sedan juni 20008 205 inlägg
#15

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.*
devotionMedlem sedan jan. 20013 582 inlägg
#16

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

Peter SMedlem sedan dec. 20025 483 inlägg
#17

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

devotionMedlem sedan jan. 20013 582 inlägg
#18

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

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

Mvh
Henrik

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)