大量のデータを空のデータベースにインポートしています。開始する前に、一意でない非クラスター化インデックスをすべて無効にして、インポートのパフォーマンスを向上できるかどうかを確認しました。
ここで、インデックスを再度有効にしたいと思います。これを最適化するために何かできることがあるかどうか疑問に思っています。
再構築する必要がある100を超えるテーブルとほぼ2,000のインデックスがあります。データベースのサイズは200GBです。
私が実行しているスクリプトの重要なセクションは次のとおりです。
declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
select 'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
from sys.indexes as i
Inner Join sys.objects o
On o.object_id = i.object_id
Where o.is_ms_shipped = 0
And i.index_id >= 1
and i.type > 1
and i.is_disabled = 1
インデックスの変更ステートメントにONLINE = OFFを設定することを検討しましたが、インデックスが最初は無効になっているので、この設定が効果があるかどうか確信が持てませんでした。また、SORT_IN_TEMPDB = ONの設定も検討しましたが、tempdbファイルはデータベースの.mdfファイルと同じドライブ上にあるため、これを行うことにも利点はないと想定しました。
再構築スクリプトを実行しているときに、CXPACKET待機タイプがたくさんあることに気付きました。なぜそうなるのか、それが対処すべき問題であるのか、本当にわかりません。
関連する可能性のある最後のポイントの1つは、データベースへのデータのインポート以外に、サーバー全体が現在非アクティブになっていることです。考慮または心配する他のユーザーアクティビティはありません。私の唯一の懸念は、可能な限り短い時間でデータベースにデータをインポートすることです。
CXPACKET
待機について:インデックスは自身を再構築し、インデックスを再構築します(インデックスが再構築されている場合でも)。これらのスキャンは並列処理を使用できます。これらの待機について心配する必要はありません。おそらく並列処理が役立つでしょう。