私は20個の以上の万行を持つテーブルを持っている、と私はとき:クラスタ化インデックス上のSQL ServerでDELETEのパフォーマンス、大きなテーブル
DELETE [Table] WHERE ID = ?
それは40秒以上かかります。 ID列はクラスタ化されています。
これはあなたが期待できるものですか?またはこれを最適化することは可能ですか?
私は20個の以上の万行を持つテーブルを持っている、と私はとき:クラスタ化インデックス上のSQL ServerでDELETEのパフォーマンス、大きなテーブル
DELETE [Table] WHERE ID = ?
それは40秒以上かかります。 ID列はクラスタ化されています。
これはあなたが期待できるものですか?またはこれを最適化することは可能ですか?
答えに含まれる細かい点JNKに加えて、私が見た1つの特定のキラーは、参照されているテーブルから1つ以上の外部キー制約についての行を削除するときです。参照テーブルは索引付けされません。削除を受け入れる前に、これらの各表の表スキャンを実行する必要があります。
これは、あなたが削除されたどのように多くの行...について
を私たちに教えていない多くの要因に依存するように起こっていますか?もっと多くの行は明らかに時間がかかることを意味します。
他のインデックスはありますか?クラスタ化されたインデックスだけでなく、すべてのインデックスを更新する必要があります。 10個のインデックスから削除する場合は、約10倍の時間がかかります(大まかに)。
他のアクティビティはありますか?更新や挿入が行われている場合は、待機と競合が発生する可能性が非常に高いです。
また、非常に一般的に言えば、操作に要する秒数は、ハードウェアの設定に応じてHIGHLYになります。これをデスクトップマシンと高性能アレイと12コアのサーバーで実行した場合の期待は非常に異なっています。
トリガーを忘れないでください... – gbn
また、バッチでデータを削除してみてください。例
set rowcount 10000
delete [table] where id = ?
while @@rowcount >0
begin
delete [table] where id = ?
end
これは、テーブル/インデックスのロック時間と競合を減らすことで並行性を向上させます。それはおそらくパフォーマンスを向上させることはありません。 – Yuck
関連するテーブルのインデックスには、外部キーのインデックスがありませんでした。それにより削除が遅くなりました。外部キー列の関連するすべての表に索引が作成され、削除には0秒かかりました。 –
うん、私たちの問題のすべての違いをしたインデックスを追加します。しかし皮肉なことに、単に "UPDATE STATISTICS [tableName]"を実行していました。試すだけの価値があります。 –