web-dev-qa-db-ja.com

外部キー制約を持つ大きなテーブルを削除するための最良のアプローチ

別のテーブルへの外部キーを持つ10億のレコードを持つテーブルをパージする方法は?テーブルと子テーブルをパーティション化し、パーティションスワップを使用する必要がありますか?

5
user103649

これを試して:

  1. 同様の構造を持つ新しいテーブルに3か月のデータを挿入します。
declare @CurDate datetime
select * 
into NewTable
from ExistingTable 
where datecol >= @CurDate and datecol <= dateadd(month,3,@CurDate)
  1. 要件に従って、古いテーブルの名前を一意の名前に変更するか、テーブルを削除します
  2. 新しいテーブルの名前をexistintgテーブルに変更します
  3. 手順3の新しい親テーブルに一致する同様の構造を持つNewChildTableに挿入します
  4. 既存の子テーブルの名前を変更または削除します
  5. 新しい子テーブルの名前を既存の子テーブルに変更する
1
KumarHarsh

私のおすすめ

1)関連するすべての外部キーの作成スクリプトを保存します

SELECT distinct 'alter table '+rcu.TABLE_SCHEMA+'.'+rcu.TABLE_NAME+' add constraint '+rc.CONSTRAINT_NAME+' foreign key ('+rcu.COLUMN_NAME+') references '+rcu1.TABLE_SCHEMA+'.'+rcu1.TABLE_NAME+'('+rcu1.COLUMN_NAME+')'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1 ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME
where rcu.TABLE_NAME='YOUR_TABLE'

2)落とした

SELECT distinct 'alter table '+rcu.TABLE_SCHEMA+'.'+rcu.TABLE_NAME+' drop constraint '+rc.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1 ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME
where rcu.TABLE_NAME='YOUR_TABLE'

3)ログが大きくならないように、このように削除を実行します

declare @var bigint, @var2 bigint, @var3 bigint
set @var = (select count_big(1) from [Your_Database]..[YOUR_TABLE](nolock) --where filter if it need
set @var2 = 0
set @var3 = 1
while @var2 <> @var
begin
set rowcount 500000
    delete from [Your_Database]..[YOUR_TABLE] --where filter if it need
    set @var2 = @var2+@@ROWCOUNT
    set @var3 = @var3+1
end

4)最後にすべての外国キーを再作成します

同じセッションで新しいスクリプトにスターを付けた後、set rowcount 0を実行することを忘れないでください

0
Krismorte