2017-03-02 7 views
0

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:

  1. 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
  2. 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)
  3. 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:

  1. SAP_LICENSING.DBO Reihen und wird von diesen Spalten definiert. calc_2_USER_ROLES: Index für DTT_ID, MANDT, UNAME, ASSIGNED_ROLE
  2. SAP_LICENSING.DBO.raw_AGR_1251: Index auf DTT_ID, MANDT, AGR_NAME, LOW, HIGH
  3. SAP_LICENSING.DBO.param_LICENSING_RULES: Index auf TRANSAC

Hier sind meine Reaktionszeiten für eine ausgewählte auf jedem Sub-Abfrage:

  1. Unterabfrage über die UR alias: 30 Sekunden
  2. Unterabfrage über die T-Alias: 1 minute und 30 Sekunden
  3. 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

+0

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

Antwort

0

Sie führen einige kostspielige String-Transformationen an Ihrer größten Tabelle durch und verwenden das Ergebnis in JOIN Zustand. Das ist zwangsläufig ineffizient. Standardmäßig würde SQL Server Optimizer die größte Tabelle als letzte setzen, also würde TJOIN ed zu UR und LR durch diese transformierten Zeichenfolgen erhalten.

Eine Möglichkeit wäre, zunächst eine temporäre Tabelle erstellen T, die andere - erstellen eine indizierte Sicht auf SAP_LICENSING.DBO.raw_AGR_1251 mit TRANSAC_FROM und TRANSAC_TO berechneten Feldern als Teil des gruppierten Index.

Sie könnten auch Glück mit dem Optimierer haben, wenn Sie T an die Vorderseite der FROM Klausel und JOIN den Rest der Tabellen verschieben. Es lohnt sich, OPTION (FORCE ORDER) damit auszuprobieren.

Die Buchung aktuellen Ausführungsplan würde auch helfen, einen richtigen Rat zu geben.

0
  • i) Ist es möglich, distinct zu entfernen?
  • ii) gehen für Batch einfügen
  • iii) Verwendung Abdeckung Index/Filterindex
  • iv) Kommentar einfügen und bearbeiten mit ausgewählten
  • v) wenn der Index nicht verwendet werden dann hv Sie Hinweis verwenden
  • Sie haben vergessen, mit (nolock)