約 4,500 万レコードのテーブルを持つ大規模な SQL Server データベースがあります。このテーブルをアーカイブしていますが、2 年以上前のすべてのエントリを削除する必要があります。アーカイブ テーブルへの挿入は正常に機能していますが、削除時の効率に問題があります。
私の問題は、現在テーブルにあるインデックスにあります。1000 レコード チャンクで削除 (およびアーカイブの挿入) したいと思います。これを行うには、要件を満たす "上位" 1000 件のレコード (2 年以上前) を特定する必要があります。行の DateTime スタンプはクラスター化されたインデックスであるため、これは行を取得するのに最適です。ただし、SQL 2000 では DELETE TOP 1000 が許可されていないため、次のようにする必要があります。
DELETE FROM <table> WHERE [UniqueID] IN
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)
UniqueID がインデックス化されている場合、これはうまく機能します。そうでないため、これには非常に長い時間がかかります (削除される 1000 レコードごとにテーブルをスキャンしています)。テーブルには、レコードを一意に識別する他のインデックスはありません。これはライブ DB であるため、UniqueID でインデックスを計算するにはコストがかかりすぎると言われています。このクエリを最適化する方法を誰か指摘できますか?