0

テーブルはほとんどなく、すべてに約 500 万行あり、各テーブルにはアクティブな列があります。Active = 0 のすべてのテーブルからデータを削除したいのですが、削除を使用すると時間がかかり、外部キー制約と ID フィールドがあるため、テーブルを切り捨てることもできません。

これを行う効率的な方法はありますか?

4

6 に答える 6

1

私はまだJRプログラマーですが、フィールドが1つしかない(Active = 0)非常に大きなものを削除する場合は、時間がかかります。私の目には2つの選択肢があります。

1)そのクエリを実行し、しばらくお待ちください。

2)クエリをいくつかの小さなクエリに分割する別の方法を見つけます。同様に、active = 0で、ユーザー名はAGで始まり、次にHPのユーザー名で始まります。(疑似例ですが、私が望むアイデアが得られますか?)

于 2012-05-16T18:16:07.563 に答える
0
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が「高価」である行を見つける場合(つまり、インデックス付けされていない選択)、最初にそれらの行の主キーを一時テーブルに選択してから、との結合に基づいてテーブルから削除を行うことができます。一時テーブル。

于 2012-05-16T22:05:31.023 に答える
0

心に留めておくべきもう 1 つのことは、レプリケーションです。テーブルが大きく、多くのレコードを削除する必要がある場合は、多数の削除が発生した後にwaitfor 遅延を設定して、レプリケーション コマンドがフラッディングしないようにすることをお勧めします。

于 2012-05-16T21:03:37.307 に答える
0

行をまとめて削除することもできます

http://www.java2s.com/Tutorial/SQLServer/0400__Transact-SQL/DeletingRowsinChunks.htm

于 2012-05-16T18:14:28.947 に答える
0

これを試して。

アイデアは、テーブルを複製し、テーブルを再作成し、アクティブなデータをコピーすることです

  1. SSMS > テーブルを右クリックし、スクリプト テーブルを選択 - 作成先 - 新しいウィンドウ (まだ実行しないでください)
  2. 既存のテーブルの名前を別の名前に変更します。
  3. ステップ 1 でスクリプトを実行する
  4. 名前の変更されたテーブルから新しく作成されたテーブルへのコピー スクリプトを実行する

    insert into newtable select * from RenamedTable where active=1

  5. 名前を変更したテーブルを削除

それがどうなるか教えてください。

于 2012-05-16T23:31:57.543 に答える
-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
于 2012-05-16T18:20:06.850 に答える