Kom ihåg mig?
Home Menu

Menu


Smartare sätt att ställa SQL-fråga?

Ämnesverktyg Visningsalternativ
Oläst 2006-10-13, 13:13 #1
maddog maddog är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2005
Inlägg: 5
maddog maddog är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2005
Inlägg: 5
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
maddog är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-13, 13:27 #2
mersault mersault är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 119
mersault mersault är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 119
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.
mersault är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-13, 13:29 #3
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-13, 14:23 #4
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
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.
digiArt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-15, 02:38 #5
kullervos avatar
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2003
Inlägg: 1 519
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
kullervos avatar
 
Reg.datum: Dec 2003
Inlägg: 1 519
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.
kullervo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-15, 11:36 #6
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
Vad säger EXPLAIN när du kör frågan?
WizKid är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 22:23.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017