I have a large data table. There are 10 million records in this table.
What is the best way for this query
Delete LargeTable where readTime < dateadd(MONTH,-7,GETDATE())
ベストアンサー1
If you are Deleting All the rows in that table the simplest option is to Truncate table, something like
TRUNCATE TABLE LargeTable GO
Truncate table will simply empty the table, you cannot use WHERE clause to limit the rows being deleted and no triggers will be fired.
一方、80 ~ 90 パーセントを超えるデータを削除する場合、たとえば合計 1,100 万行あり、そのうち 1,000 万行を削除したい場合、別の方法として、これらの 100 万行 (保持したいレコード) を別のステージング テーブルに挿入します。この大きなテーブルを切り捨て、これらの 100 万行を挿入し直します。
または、この大きなテーブルを基礎テーブルとして持つ権限/ビューまたはその他のオブジェクトが、このテーブルを削除しても影響を受けない場合は、これらの比較的少量の行を別のテーブルに取得し、このテーブルを削除して同じスキーマを持つ別のテーブルを作成し、これらの行をこの非常に大きなテーブルにインポートし直すことができます。
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
リカバリ モードを完全に戻すことを忘れないでください。また、変更またはリカバリ モードを完全に有効にするには、バックアップを取る必要があると思います。