AFRAGE OPTIMIERUNG

09/04/2010 - 18:10 von Phenich Lebao | Report spam
Hallo alle,

Brauche eure Hilfe
Kann mir jemand sagen wie ich diese Abfrage optimieren kann?

SELECT A.BS_UNT, 'AP', COUNT(DISTINCT A.VOUCHER_ID)
FROM PS_CTG_LNE A
WHERE A.BS_UNT IN (SELECT F.BS_UNT
FROM P_SEC_CLSA F
WHERE F.OPRCLASS = 'PR_ALL')
AND A.GL_DISTRIB_STATUS <> 'D'
GROUP BY A.BS_UNT
UNION
SELECT B.BS_UNT, 'AM', COUNT(DISTINCT B.ASSET_ID)
FROM PS_DIST_LN B
WHERE B.GL_DISTRIB_STATUS <> 'D'
AND B.FISCAL_YEAR >= YEAR({ fn CURDATE() })-1
AND B.BS_UNT IN (SELECT G.BS_UNT
FROM P_SEC_CLSA G
WHERE G.OPRCLASS = 'PR_ALL')
GROUP BY B.BS_UNT
UNION
SELECT C.BS_UNT, 'AR', COUNT(DISTINCT C.ITEM)
FROM PS_ITEM_DST C
WHERE C.BS_UNT IN (SELECT H.BS_UNT
FROM P_SEC_CLSA H
WHERE H.OPRCLASS = 'PR_ALL')
AND C.GL_DISTRIB_STATUS <> 'D'
GROUP BY C.BS_UNT
UNION
SELECT D.BS_UNT, 'PO', COUNT(DISTINCT D.RECEIVER_ID)
FROM PS_RECV_LN_ACCTG D
WHERE D.BS_UNT IN (SELECT I.BS_UNT
FROM P_SEC_CLSA I
WHERE I.OPRCLASS = 'PR_ALL')
AND D.GL_DISTRIB_STATUS <> 'D'
GROUP BY D.BS_UNT
UNION
SELECT E.BS_UNT, 'IN', COUNT(DISTINCT TRANSACTION_GROUP)
FROM PS_CM_ACCTG_LINE E
WHERE E.GL_DISTRIB_STATUS <> 'D'
AND E.BS_UNT IN (SELECT J.BS_UNT
FROM P_SEC_CLSA J
WHERE J.OPRCLASS = 'PR_ALL')
GROUP BY E.BS_UNT
ORDER BY 1

MFG
 

Lesen sie die antworten

#1 Elmar Boye
09/04/2010 - 19:07 | Warnen spam
Hallo Phenich,

"Phenich Lebao" schrieb ...
can mir jemand helfen by der optiemierung dieser Abfrage



anscheinend hast Du meine frühere Antwort vom 1.4. auf Deine
gleich Frage vom 31.3 nicht gesehen, deswegen noch einmal:

ohne die Tabellen und deren Index-Struktur ist das schwer möglich.

Du solltest zunàchst die Einzelabfragen auf ihre Ausführungsplàne
hin testen.

SELECT A.BS_UNT, 'AP', COUNT(DISTINCT A.VOUCHER_ID)
FROM PS_CTG_LNE A
WHERE A.BS_UNT IN (SELECT F.BS_UNT
FROM P_SEC_CLSA F
WHERE F.OPRCLASS = 'PR_ALL')
AND A.GL_DISTRIB_STATUS <> 'D'
GROUP BY A.BS_UNT
UNION
[...]


anstatt UNION solltest Du durchgàngig UNION ALL verwenden,
da kein weiteres zusammenfassen notwendig ist.

Für die immer wieder auftauchende Teilabfrage:
SELECT F.BS_UNT FROM P_SEC_CLSA F WHERE F.OPRCLASS = 'PR_ALL'

wàre ein abdeckender oder gefilterter Index (SQL Server 2008) sinnvoll.

Gruß Elmar

Ähnliche fragen