1. ホーム
  2. sql-server

[解決済み] SQLでログのないテーブルの大きなデータを削除する方法は?

2022-05-10 07:29:43

質問

大きなデータ表があります。 このテーブルには1,000万件のレコードがある。

このクエリに最適な方法は何ですか?

   Delete LargeTable where readTime < dateadd(MONTH,-7,GETDATE())

どのように解決するのですか?

  1. そのテーブルのすべての行を削除する場合、最も簡単な方法は、次のようにテーブルを切り詰めることです。

     TRUNCATE TABLE LargeTable
     GO
    
    

WHERE句で削除する行を制限することはできず、トリガも発生しません。

  1. 一方、80 ~ 90% 以上のデータを削除する場合、たとえば、合計 1100 万行のデータがあり、1000 万行を削除する場合、別の方法として、これらの 100 万行 (維持したいレコード) を別のステージング テーブルに挿入することができます。この大規模なテーブルを切り捨て、これらの100万行を挿入して戻ってくる。

  2. あるいは、このラージテーブルを基礎テーブルとするパーミッション/ビューや他のオブジェクトが、このテーブルを削除しても影響を受けない場合、これらの比較的少量の行を別のテーブルに取得し、このテーブルを削除して同じスキーマで別のテーブルを作成し、これらの行をこの元ラージテーブルに戻してインポートすることができます。

  3. 私が思いつく最後のオプションは、データベースの Recovery Mode to SIMPLE を変更し、以下のような while ループを使用して行を小分けに削除することです。

     DECLARE @Deleted_Rows INT;
     SET @Deleted_Rows = 1;
    
    
     WHILE (@Deleted_Rows > 0)
       BEGIN
        -- Delete some small number of rows at a time
          DELETE TOP (10000)  LargeTable 
          WHERE readTime < dateadd(MONTH,-7,GETDATE())
    
       SET @Deleted_Rows = @@ROWCOUNT;
     END
    
    

で、リカバリーモードをフルに戻すのを忘れずに、バックアップを取らないと完全に効果がないと思います(変更、リカバリーモード)。