2016-08-13 7 views
0

私は大きなデータベース(1.7 TBサイズ)を持っており、インデックスを再構築するためのメンテナンスインデックスジョブを持っています。この仕事は午後11時に予定されています。インデックスジョブで同時に大きなクエリを実行するにはどうすればよいですか?

今朝、私はサーバ上で実行されているクエリをチェックしていましたが、インデックスジョブがまだ実行中(10時間以上)しています。サーバ上で実行されている別のt-SQLクエリジョブがそのインデックスを再構築しようとしていたテーブルをロックしました。無限の進歩のようだったので、インデックスジョブを実行させ続けるために、ブロックセッション(169)を終了しなければなりませんでした。私の質問は、どのようにインデックスジョブが作業しているテーブルをロックするのを避けることができます。インデックスを再構築するとテーブルbcsがオフラインにロックされていることがわかりますが、22時間以上実行されていたt-sqlクエリを最適化する必要がありますか? Bcsこのt-SQLクエリは、当日のERPアプリケーションによって頻繁に実行されています。

クエリは次のとおりです。

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) 

**ロックされたテーブルには、次のとおりです。CUSTTRANSOPEN

私が意味する、元のために。私はクエリにWITH(NOLOCK)文を置くべきですか? インデックスジョブで同時に大きなクエリを実行するにはどうすればよいですか?

**私はstandart edition sql serverを持っています。したがって、「オンライン再構築」は不可能です。

enter image description here

答えて

1

次の2つの問題を抱えて:あなたは唯一NOLOCKを置いてもよい


  • - 同時実行ALTER INDEX

    1. チューニングクエリ -
      を調整することが可能性がある大規模なクエリを、あなたが結果に気にしないならば。
    2. クエリは、3つのテーブルすべての行の乗算を生成すると思われるデカルト結合を実行します。それは20時間かかりません。それは意図ではないかもしれません。だから、あなたが何を望むかを決める。ここに簡略化されたクエリのサンプルがあります。それは同じロジックを作成するかどうかを確認します:

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);

  • 計画はあなたがOPTION (FAST 5)
  • 参照を除外した場合に優れている場合は、実行計画で

  • ルックを見ていますインデックスを作成してクエリを向上させることができます。

    1. CUSTTRANSOPENテーブルを除いて、インデックスを1つずつ変更することができます。クエリが終了するとそのインデックスを変更します。
関連する問題