Hoffmann: SQL Performance Verbesserung

Hallo zusammen,

ich habe hier ein sehr inperformantes SQl-Script das unter Oracle 10g Release 2 läuft, vielleicht kann mir ja jemand evtl einen Tuning Tip dazu geben, bin für jeden Tip dankbar, das Script läuft momentan sehr langsam und muss schneller werden:

SELECT POH.Id, POH.SupplierName, POH.Id, COM.Name, COM.ClientCode, POH.BuyerOrderRef, POH.SentDate OrderDateTimeFilter, POH.Id, POH.Id, POH.Id, MAX(PRJ.PRJNO), PRH.Name, POH.Id, POH.SentDate DeliveryWish, POH.SentDate Delivery, POH.Id Articlename, POH.Id ArticleSuppNo, POH.Id reasontreatmentfilter

FROM POI LEFT OUTER JOIN PRIPOI ON POI.ID=PRIPOI.POI_IDLEFT OUTER JOIN PRI ON PRIPOI.PRI_ID=PRI.IDLEFT OUTER JOIN PRJ ON PRI.PRJ_ID=PRJ.ID, COM, PRH, PRHCOMPOH, POH

WHERE(POH.ECOSAttributes<268435456
AND POH.DeliveredCom=COM.Id
AND PRH.ID=PRHCOMPOH.PRH_ID
AND POH.ID=PRHCOMPOH.POH_ID
AND{ecos TESTBIT(POH.ECOSAttributes, 1048576, false)
AND NOT POH.SentDate IS NULL
AND((1=1)OR POH.USR_Id=20509 or exists(select 1
from PRHCOMPOH, PRH
where POH.Id=PRHCOMPOH.POH_Id
AND PRH.Id=PRHCOMPOH.PRH_Id
AND PRH.USR_Id=20509))
AND EXISTS(SELECT POI.Id
FROM POI, PRIPOI b
WHERE POH_Id=POH.Id
AND POI.ItemType=0
AND POI.OrderAmount>0
AND b.POI_Id=POI.Id
AND(({fn IFNULL((SELECT SUM(R.ccount)
FROM PRIPOIDNI R
WHERE R.POI_Id=POI.Id), 0))<{fn IFNULL((SELECT SUM(a.ccount)
FROM PRIPOI a
WHERE a.PRI_Id=b.PRI_Id), 0)))
AND POH.ID=POI.POH_ID)
AND(POH.SentDate>='2009-09-01 00:00:00')
GROUP BY POH.Id, POH.SupplierName, COM.Name, COM.ClientCode, POH.BuyerOrderRef, POH.SentDate, PRH.Name
ORDER BY OrderDateTimeFilter DESC

  1. Mahlzeit Hoffmann,

    FROM POI LEFT OUTER JOIN PRIPOI ON POI.ID=PRIPOI.POI_IDLEFT OUTER JOIN PRI ON PRIPOI.PRI_ID=PRI.IDLEFT OUTER JOIN PRJ ON PRI.PRJ_ID=PRJ.ID, COM, PRH, PRHCOMPOH, POH

    Als erstes würde ich Dir empfehlen, explizite und implizite JOIN-Syntax nicht miteinander zu vermischen. Das sollte zwar eigentlich wenig Auswirkung auf die Performance haben, erhöht aber deutlich die Lesbarkeit. Je besser die Abfrage verständlich ist, desto eher fällt einem Optimierungspotential ins Auge.

    Darüber hinaus bietet auch Oracle die Möglichkeit, einen sogenannten "Explain Plan" anzuzeigen (im PL/SQL-Developer z.B. recht komfortabel durch Drücken von [F5] möglich), der Dir die "Kosten" Deines Statements anzeigt.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Es gibt etliche Sub-SELECTs, die sind sicher schwer daran beteiligt.
    Vielleicht kannst du ja die rausoptimieren.
    Das ganze liest sich übrigens sehr schlecht, ich kann da kaum was näheres zu sagen.