2016-08-13 1 views
0

Ich habe eine große Datenbank (Größe 1,7 TB) und habe einen Wartungsindexjob, um Indizes neu aufzubauen. Dieser Job ist um 11:00 Uhr geplant.Wie führen Sie gleichzeitig große Abfragen mit dem Indexjob aus?

Heute Morgen habe ich nur die Abfragen überprüft, die auf dem Server laufen, und ich bemerkte, dass der Index-Job noch läuft (mehr als 10 Stunden), weil eine andere T-SQL-Abfrage auf dem Server mehr als 22 ausgeführt wurde Stunden und schloss die Tabelle, dass der Job versuchte, die Indizes davon neu zu erstellen. Es war wie ein endloser Fortschritt, also musste ich die Blockierungssitzung beenden (169), um den Indexjob weiterlaufen zu lassen. Meine Frage ist; Wie kann ich verhindern, dass Tabellen, an denen der Indexjob arbeitet, gesperrt werden? Ich weiß, dass der Index zum Neuaufbau die Tabelle bcs offline bindet, aber sollte ich etwas Optimierung für die t-sql-Abfrage durchführen, die mehr als 22 Stunden lief? Bcs diese T-SQL-Abfrage wird oft von unserer ERP-Anwendung am Tag ausgeführt.

Die Abfrage ist;

SELECT T1.ACCOUNTNUM,T1.AMOUNTCUR,T1.AMOUNTMST,T1.DUEDATE,T1.RECID,T1.RECVERSION,T1.REFRECID,T1.TRANSDATE,T1.RECVERSION,T2.INVOICE 
,T2.TRANSTYPE,T2.TRANSDATE,T2.AMOUNTCUR,T2.ACCOUNTNUM,T2.VOUCHER,T2.COLLECTIONLETTERCODE,T2.SETTLEAMOUNTCUR,T2.CURRENCYCODE, 
T2.CUSTBILLINGCLASSIFICATION,T2.RECVERSION,T2.RECID,T3.ACCOUNTNUM,T3.PARTY,T3.CURRENCY,T3.RECID,T3.RECVERSION 
FROM **CUSTTRANSOPEN** T1 
CROSS JOIN CUSTTRANS T2 
CROSS JOIN CUSTTABLE T3 

WHERE ((([email protected]) AND ([email protected])) AND (T1.DUEDATE<@P3)) AND ((([email protected]) AND 
([email protected])) AND (((((((T2.TRANSTYPE<[email protected]) OR ([email protected])) OR (([email protected]) OR ([email protected]))) 
    OR ((([email protected]) OR ([email protected])) OR ([email protected]))) AND (T2.AMOUNTCUR>[email protected])) 
AND (T1.ACCOUNTNUM=T2.ACCOUNTNUM)) AND (T1.REFRECID=T2.RECID))) AND ((([email protected]) AND ([email protected])) 
    AND (T2.ACCOUNTNUM=T3.ACCOUNTNUM)) ORDER BY T1.DUEDATE OPTION(FAST 5) 

** Die gesperrte Tabelle ist: CUSTTRANSOPEN

Ich meine, für ex. sollte ich eine WITH (NOLOCK) -Anweisung in die Abfrage einfügen? Wie führen Sie große Abfragen gleichzeitig mit dem Indexauftrag aus?

** Ich habe Standard Edition SQL Server. Ein Online-Wiederaufbau ist also nicht möglich.

enter image description here

Antwort

1

Sie haben zwei Probleme:
- große Abfrage, die abgestimmt werden könnte
- Gleichzeitige Lauf ALTER INDEX

  1. Tuning query:
    • Sie NOLOCK setzen dürfen nur wenn dir das Ergebnis egal ist.
    • Ihre Abfrage führt kartesische Joins durch, die eine Multiplikation von Zeilen aller drei Tabellen erzeugen sollen. Kein Wunder, dass es 20 Stunden dauert. Es könnte nicht die Absicht sein. Also, bestimmen Sie, was genau Sie wollen. Hier ist ein Beispiel für eine vereinfachte Abfrage. Stellen Sie sicher, ob das die gleiche Logik erzeugt:

SELECT T1.ACCOUNTNUM, T1.AMOUNTCUR, T1.AMOUNTMST, T1.DUEDATE, T1.RECID , T1.RECVERSION, T1.REFRECID, T1.TRANSDATE, T1.RECVERSION, T2.INVOICE , T2.TRANSTYPE, T2.TRANSDATE, T2.AMOUNTCUR, T2.ACCOUNTNUM, T2.VOUCHER , T2.COLLECTIONLETTERCODE, T2.SETTLEAMOUNTCUR, T2.CURRENCYCODE, T2.CUSTBILLINGCLASSIFICATION, T2.RECVERSION , T2.RECID, T3.ACCOUNTNUM, T3.PARTY, T3.CURRENCY, T3.RECID, T3.RECVERSION FROM **CUSTTRANSOPEN** AS T1 INNER JOIN CUSTTRANS AS T2 ON T1.ACCOUNTNUM=T2.ACCOUNTNUM AND T1.REFRECID=T2.RECID AND [email protected] AND [email protected] AND T2.AMOUNTCUR>[email protected] AND (T2.TRANSTYPE<[email protected] OR T2.TRANSTYPE IN (@P7, @P8, @P9, @P10, @P11, @P12) INNER JOIN CUSTTABLE AS T3 ON T2.ACCOUNTNUM=T3.ACCOUNTNUM AND [email protected] AND [email protected] AND WHERE [email protected] AND [email protected] AND T1.DUEDATE<@P3 AND ORDER BY T1.DUEDATE OPTION (FAST 5);

  • Sie haben
  • Blick auf den Ausführungsplan suchen, wenn Plan besser ist, wenn Sie OPTION (FAST 5)
  • See ausschließen wenn Sie die Abfrage durch Indexierung verbessern können.

    1. Sie können Indizes einzeln ändern, ohne Ihre CUSTTRANSOPEN Tabelle zu berücksichtigen. und ALTER seine Indizes, wenn die Abfrage beendet ist.
Verwandte Themen