23

私は非常に大きなテーブルを持っているので、以下を使用して古いエントリを削除しています。

WHILE (@@ROWCOUNT > 0)
BEGIN
    DELETE TOP (5000) FROM myTable
    WHERE date < 20130103
END

私はこれを異なる日付を使用して数回実行しました。正常に動作する場合もありますが(約20分かかります)、クエリがすぐに終了して何も削除されない場合もあります。その場合は、そのテーブルから単純なSELECTステートメントを実行し、上記のWHILEステートメントを再試行すると、機能します。なぜこれなのか誰もが知っていますか?このクエリを自動化して定期的に実行し、テーブルサイズを制御する必要がありますが、実行時に実際に適切に削除されることを確認したいと思います。ありがとうございました。

4

6 に答える 6

11

おそらく、その理由は が@@ROWCOUNT値 0 に初期化されているためです。

最初にこのクエリを実行して設定できます。

select count(*) from myTable where date < 20130103

これにより、クエリに少し時間がかかりますが、削除される行数が表示されます。

次のようなこともできます。

select top 1     * from myTable 

これははるかに速くなります。

于 2013-03-21T21:08:06.407 に答える
6

最初の実行を含め、すべての実行の@@ROWCOUNTに条件をチェックするため、whileループが実行されないことがあります。

do-whileSQL Server にはループが組み込まれていないため、ここに自家製のループがあります。

loop:
   DELETE TOP (5000) FROM myTable
   WHERE date < 20130103
if @@ROWCOUNT > 0 goto loop
于 2013-03-21T21:11:35.167 に答える
1

クエリを次のように書くこともできます。

SET ROWCOUNT 5000; -- set batch size
WHILE EXISTS (SELECT 1 FROM myTable WHERE date < '2013-01-03')
BEGIN
    DELETE FROM myTable
    WHERE date < '2013-01-03'
END;
SET ROWCOUNT 0; -- set batch size back to "no limit"

いずれにせよ、日付文字列を適切にフォーマットする必要があります。

削除基準とexists句のステートメントが同一であることを確認してください。そうしないと、無限ループが発生する可能性があります。

于 2013-06-18T19:02:10.357 に答える