2017-06-23 9 views
3

SQL Serverに2つのテーブルがあり、そのうちの1つは別のテーブルへのMERGE操作のソースです。マージステートメントの最適化

ソース表が30Milレコード

ターゲット表を持っている180Milレコードがあります。どちらの表にも227列あります。

私はSSISを持っていますが、この場合はMERGEステートメントが最適です。以下は、その短縮版である:

;WITH MySource as (
    SELECT * FROM [STAGE].[dbo].[STAGE_TABLE] 
) 
MERGE [EDW].[dbo].[TARGET_TABLE] AS MyTarget 
USING MySource 
    ON MySource.[ID_FIELD] = MyTarget.[ID_FIELD] 
    AND MySource.[LoadDate] >= MyTarget.[LoadDate] 
WHEN MATCHED THEN UPDATE SET 
    <<Target Column>> = MySource.<<Source Colums>> --227 columns 
WHEN NOT MATCHED THEN INSERT 
    (
     [ID_FIELD], 
     [LoadDate], 
     <<225 Other Columns>> 
    ) 
    VALUES (
     MySource.[ID_FIELD], 
     MySource.[LoadDate], 
     MySource.<<225 other columns>> 
    ); 

私は上記のスクリプトに対して行われた変更のみがここに短いコードブロックを維持するために列のリストを切り捨てています。

私の問題は、私が実行に掛かっているということです。プロファイル画面にCXPACKET停止とエラー:cwaitpipenewrow, node=2が表示されます。

このトラブルシューティングを行うにはどうすればよいですか?ありがとうございました。

答えて

0

CXPACKETとサスペンド状態のように見えるのは、完了していないスレッドがまだ完了していない他のスレッドの状態を記録していることを意味します。 こちらをご確認ください。クエリは、テーブルの最大10億の値を更新する必要があります。したがって、クエリの実行が遅くなります。

https://dba.stackexchange.com/questions/96346/cxpacket-suspended-and-null-wait-type

https://www.sqlshack.com/troubleshooting-the-cxpacket-wait-type-in-sql-server/

これらの記事はあなたのデバッグを助けるかもしれない願っています。