Ich versuche derzeit, einige SAP-Analyse in Bezug auf die Lizenzierung durchzuführen. Ich möchte Benutzer über ihre Rollen mit Transaktionen verknüpfen und die erforderlichen Lizenzen basierend auf ihren Transaktionen abrufen. Diese Analyse wird auf mehreren SAP-Servern durchgeführt, wobei jeder Server mehrere SAP-Instanzen enthält. An einem Punkt dieser Analyse habe ich Schwierigkeiten mit großen Tabellen und Abfrage-Optimierung, da die Abfrage nie endet (mehr als 10 Stunden laufen (obwohl ich 128 GB RAM und große CPU-Leistung haben)SQL Server Große Tabelle Query Optimierung
Hier sind einige Details über die Tabellen basierend ich meine Abfrage auf:
- SAP_LICENSING.DBO.calc_2_USER_ROLES, die 1 M Zeilen enthalten und von diesen Spalten definiert: DTT_ID (SAP-Servername), MANDT (SAP-Instanzname), UNAME (Benutzername) , ASSIGNED_ROLE (Rolle, der er zugeordnet ist, zB: accoutant) Diese Tabelle speichert die den Benutzern zugeordneten Rollen
- SAP_LICENSING.DBO.raw_AGR_1251, die 2M enthält Zeilen und wird durch diese Spalten definiert: DTT_ID (SAP-Servername), MANDT (SAP-Instanzname), AGR_NAME (Rolle), LOW (Transaktionsbereichstart), HIGH (Transaktionsbereichsende)
- SAP_LICENSING.DBO.param_LICENSING_RULES enthält 140K TRANSAC (Transaktion), Lizenz (erforderlich Lizenz für die damit verbundenen Transaktions)
ich habe set Clustered-Index für jede dieser Tabellen:
- SAP_LICENSING.DBO Reihen und wird von diesen Spalten definiert. calc_2_USER_ROLES: Index für DTT_ID, MANDT, UNAME, ASSIGNED_ROLE
- SAP_LICENSING.DBO.raw_AGR_1251: Index auf DTT_ID, MANDT, AGR_NAME, LOW, HIGH
- SAP_LICENSING.DBO.param_LICENSING_RULES: Index auf TRANSAC
Hier sind meine Reaktionszeiten für eine ausgewählte auf jedem Sub-Abfrage:
- Unterabfrage über die UR alias: 30 Sekunden
- Unterabfrage über die T-Alias: 1 minute und 30 Sekunden
- Unteranfrage in Bezug auf die LR-Alias: 5 Sekunden
Bitte beachten Sie die folgenden Punkte:
- wenn diese Abfrage ausgeführt wird, ich eine max Nutzung von 10% der CPU und 30% der RAM siehe
- die Abfrage schnell auf eine Subgruppe von SAP-Servern arbeitet (Filter auf 1 SAP-Servernamen)
- die zweite Unterabfrage verwendet wird SAP-Transaktionsbereich in durchsuchbare Transaktionen zu verwandeln kompatibel mit einem JOIN mit dem Schlüsselwort BETWEEN
- die LEFT JOIN wird verwendet, weil ich nicht angepasste Transaktionen für die weitere Analyse halten will
Hier ist die damit verbundene Abfrage, die ich mit bin zu kämpfen:
INSERT INTO SAP_LICENSING.DBO.calc_3_USER_ROLES_TRANSACTIONS
SELECT UR.DTT_ID,UR.MANDT,UR.UNAME,UR.ASSIGNED_ROLE,
TRANSAC_FROM,TRANSAC_TO,SAP_TRANSAC_RANGE,LR.TRANSAC,LR.LICENSE
--Get User Role Assignments
FROM
(
SELECT DISTINCT UR.DTT_ID,UR.MANDT,UR.UNAME,UR.ASSIGNED_ROLE
FROM SAP_LICENSING.DBO.calc_2_USER_ROLES UR
)UR
--Join on transactions and Convert SAP Transaction ranges into SQL searchable ranges
JOIN
(
SELECT T.DTT_ID,T.MANDT,T.AGR_NAME,T.AUTH,
replace(replace(T.LOW,'*',' '),'$',' ') AS TRANSAC_FROM,
replace(replace(coalesce(T.HIGH,T.LOW),'*',left('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ',41-len(coalesce(T.HIGH,T.LOW)))),'$','Z') AS TRANSAC_TO,
CONCAT(T.LOW,' TO ', isnull(T.HIGH,'')) as SAP_TRANSAC_RANGE
FROM SAP_LICENSING.DBO.raw_AGR_1251 T
)T
ON UR.ASSIGNED_ROLE=T.AGR_NAME and UR.MANDT=T.MANDT and UR.DTT_ID=T.DTT_ID
--Join on transactions requiring a license
LEFT JOIN SAP_LICENSING.DBO.param_LICENSING_RULES LR
ON LR.TRANSAC between T.TRANSAC_FROM and T.TRANSAC_TO;
Vielen Dank für jede Hilfe würden Sie. Kindest Regard
zu verwenden, wenn Anfragen veröffentlichen, die optimiert werden müssen, wäre es gut, nur (kann verantwortlich sein), wenn Sie minimal repro Post für andere test.Here ist ein gutes Beispiel dafür, wie man Generiere Tabellenschema, Statistiken für andere zu repro. Schau dir meine Frage an DBA.SE für weitere Informationen: http: //dba.stackexchange.com/questions/157353/wrapping-query-in-if-exists-makes-it-very-slow – TheGameiswar