WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Smartare sätt att ställa SQL-fråga? (https://www.wn.se/forum/showthread.php?t=16838)

maddog 2006-10-13 13:13

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

mersault 2006-10-13 13:27

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.

eg0master 2006-10-13 13:29

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

digiArt 2006-10-13 14:23

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.

kullervo 2006-10-15 02:38

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.

WizKid 2006-10-15 11:36

Vad säger EXPLAIN när du kör frågan?


Alla tider är GMT +2. Klockan är nu 15:59.

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