テーブルはほとんどなく、すべてに約 500 万行あり、各テーブルにはアクティブな列があります。Active = 0 のすべてのテーブルからデータを削除したいのですが、削除を使用すると時間がかかり、外部キー制約と ID フィールドがあるため、テーブルを切り捨てることもできません。
これを行う効率的な方法はありますか?
テーブルはほとんどなく、すべてに約 500 万行あり、各テーブルにはアクティブな列があります。Active = 0 のすべてのテーブルからデータを削除したいのですが、削除を使用すると時間がかかり、外部キー制約と ID フィールドがあるため、テーブルを切り捨てることもできません。
これを行う効率的な方法はありますか?
私はまだJRプログラマーですが、フィールドが1つしかない(Active = 0)非常に大きなものを削除する場合は、時間がかかります。私の目には2つの選択肢があります。
1)そのクエリを実行し、しばらくお待ちください。
2)クエリをいくつかの小さなクエリに分割する別の方法を見つけます。同様に、active = 0で、ユーザー名はAGで始まり、次にHPのユーザー名で始まります。(疑似例ですが、私が望むアイデアが得られますか?)
declare @batchsize int 10000;
while(1=1)
begin
delete top (@batchsize)
from your_table
where isActive = 0;
if (@@rowcount = 0)
begin
break
end
end
isActive = 0が「高価」である行を見つける場合(つまり、インデックス付けされていない選択)、最初にそれらの行の主キーを一時テーブルに選択してから、との結合に基づいてテーブルから削除を行うことができます。一時テーブル。
心に留めておくべきもう 1 つのことは、レプリケーションです。テーブルが大きく、多くのレコードを削除する必要がある場合は、多数の削除が発生した後にwaitfor 遅延を設定して、レプリケーション コマンドがフラッディングしないようにすることをお勧めします。
行をまとめて削除することもできます
http://www.java2s.com/Tutorial/SQLServer/0400__Transact-SQL/DeletingRowsinChunks.htm
これを試して。
アイデアは、テーブルを複製し、テーブルを再作成し、アクティブなデータをコピーすることです
名前の変更されたテーブルから新しく作成されたテーブルへのコピー スクリプトを実行する
insert into newtable select * from RenamedTable where active=1
名前を変更したテーブルを削除
それがどうなるか教えてください。
これは、バッチで行を削除するために過去に使用したテンプレートです。試してみてください。
-- Pick the boundaries of the data you want to delete based on
-- the Primary Key of your table
DECLARE
@StartID INT, -- Pick the appropriate datatype of your PK
@EndID INT, -- Pick the appropriate datatype of your PK
@BatchSize INT, -- Number of rows to delete in batch
@Count INT -- Temporary counter of rows deleted
SELECT TOP 1
@StartID = PrimaryKeyID
FROM
dbo.Table WITH (NOLOCK)
ORDER BY
PrimaryKeyID ASC
SELECT TOP 1
@EndID = PrimaryKeyID
FROM
dbo.Table WITH (NOLOCK)
ORDER BY
PrimaryKeyID DESC
SELECT
@BatchSize = 1000,
@Count = 1
-- You can skip this table if you like
-- The idea is to reduce the number of rows processed
-- in the batch below
CREATE TABLE #Temp
(
[ID] INT
)
WHILE @Count > 0
BEGIN
TRUNCATE TABLE #Temp
DELETE TOP (@BatchSize)
FROM
dbo.Table WITH (ROWLOCK)
OUTPUT
DELETED.PrimaryKeyID
INTO #Temp
(
[ID]
)
WHERE
PrimaryKeyID >= @StartID
AND PrimaryKeyID <= @EndID
AND Active = 0
SET @Count = @@ROWCOUNT
IF @Count = 0
BEGIN
BREAK
END
-- Move the @StartID
SELECT TOP 1
@StartID = [ID]
FROM
#Temp
ORDER BY
[ID] DESC
WAITFOR DELAY '00:01' -- delay for 1 second to allow any other queries running to process
END