FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Nykomling
|
Nå'n SQL-Guru där ute?
Finns det ett annat sätt att skriva den här frågan på? Den tenderar att bli seg pga att det är "fråga i fråga". SELECT COUNT(ID) FROM tblTable WHERE ChildID = 100 AND ParentID NOT IN ( SELECT ChildID FROM tblTable WHERE ParentID = 100 ) AND Rejected = 0 |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
maddog>> Kommer inte på någon bättre fråga, men du har väl indexerat ChildID och ParentID? Om de är indexerade borde det inte vara en så jobbig fråga...
Förstår att du har någon typ av träd/hierarki och vill kolla så att du inte får en loop i trädet i frågan, kanske går det annars att designa skapandet så att den situationen inte uppstår? Beror ju helt på vad det är du gör för någonting iof. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Mycket flitig postare
|
Jag har tyvärr inget enkelt svar på din fråga, men kan berätta att det är inte bara faktumet att du använder en sub-query som är ett potentiellt prestandaproblem utan även att du använder "not in". NOT IN är typiskt en funktion som kan göra en i övrigt snabb fråga väldigt långsam. Att försöka skriva sina frågor med IN istf NOT IN är att föredra då NOT IN tenderar att sällan utnyttja index tyvärr.
eventuellt skulle en case kunna förbättra prestanda. Något i denna stil: SELECT COUNT(ID) FROM tblTable WHERE ChildID = 100 AND 1 = case when ParentID IN ( SELECT ChildID FROM tblTable WHERE ParentID = 100 ) THEN 0 ELSE 1 END AND Rejected = 0 |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Har WN som tidsfördriv
|
Titta på att använda NOT EXISTS istället för NOT IN.
Som jag känner till den funktionen så stannar den så fort den springer på ett värde, medan NOT IN söker hela tabellen oavsett vilket. Men jag är ingen DBA, mest hobbyknackare främst i SqlServer. |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Bara ett inlägg till!
|
Vilken databas handlar det om? Min erfaranhet av MySQL 4.1 är att den kan ha riktigt stora prestandaproblem med den typen av frågor. Om subquerien inte returnerar många rader är det oftare snabbare att först ställa subquerien, generera en kommaseparerad lista och stoppa in den som argument i huvudquerien. Visst, det låter jättedumt men ibland kan det resultera i exekveringstid på bara några bråkdelar av vad det annars hade tagit.
Edit: Testa annars en yttre join. |
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
Vad säger EXPLAIN när du kör frågan?
|
||
![]() |
![]() |
Svara |
|
|