0

アプリケーションのスモーク テストを実行できるように、SQL Server データベースに基づくデータのサブセットを取得したいと考えています。私の典型的なワークフローは次のとおりですが、X、Y、Z には何億もの行があるため、削除クエリには 1 時間以上かかります。わかりやすくするために、回答に T-SQL コードを使用してください。

  • 各テーブルに対して次のコマンドを実行して、各テーブルをバックアップします。

    SELECT * INTO BACKUP_SRC_PATIENT FROM [SRC_PATIENT] -- has PK patient_id
    SELECT * INTO BACKUP_SRC_X FROM [SRC_X] -- has FK patient_id
    SELECT * INTO BACKUP_SRC_Y FROM [SRC_Y] -- has FK patient_id
    SELECT * INTO BACKUP_SRC_Z FROM [SRC_Z] -- has FK patient_id
    
  • 100 人を除くすべての患者を削除する

    DELETE FROM [SRC_PATIENT] 
    WHERE [PATIENT_ID_NONNUM] NOT IN 
          (SELECT top 100 [PATIENT_ID] FROM [SRC_PATIENT]
           WHERE BLA = 'BLA')
    
  • SRC_PATIENT に患者 ID がない SRC_X、SRC_Y、および SRC_Z からデータを削除します。

    DELETE FROM [SRC_X] 
    WHERE [PATIENT_ID] NOT IN 
          (SELECT [PATIENT_ID] FROM [SRC_PATIENT])
    
    DELETE FROM [SRC_Y] 
    WHERE [PATIENT_ID] NOT IN 
          (SELECT [PATIENT_ID] FROM [SRC_PATIENT])
    
    DELETE FROM [SRC_Z] 
    WHERE [PATIENT_ID] NOT IN 
          (SELECT [PATIENT_ID] FROM [SRC_PATIENT])
    
4

2 に答える 2

0

100 行を除くすべての行を削除する代わりに、テーブルを切り捨て、バックアップから 100 行以上をコピーします。

TRUNCATEは、行ごと (場合によってはページごと) にデータを削除することなく、テーブルからすべてのデータをクリップします。

TRUNCATE TABLE [SRC_PATIENT]
TRUNCATE TABLE [SRC_X]
TRUNCATE TABLE [SRC_Y]
TRUNCATE TABLE [SRC_Z]

INSERT INTO [SRC_PATIENT]
SELECT TOP 100 * FROM [BACKUP_SRC_PATIENT]
WHERE BLA = 'BLA' 

INSERT INTO [SRC_X]
SELECT * FROM [BACKUP_SRC_X]
WHERE [PATIENT_ID] IN (SELECT [PATIENT_ID] FROM [SRC_PATIENT])

INSERT INTO [SRC_Y]
SELECT * FROM [BACKUP_SRC_Y]
WHERE [PATIENT_ID] IN (SELECT [PATIENT_ID] FROM [SRC_PATIENT])

INSERT INTO [SRC_Z]
SELECT * FROM [BACKUP_SRC_Z]
WHERE [PATIENT_ID] IN (SELECT [PATIENT_ID] FROM [SRC_PATIENT])
于 2013-04-08T18:14:45.513 に答える