0

我有一個表(比如表1),其主鍵與其他10個表有外鍵關係。所有這些表都有數百萬的數據。我需要以性能有效的方式刪除Table1中的所有孤立記錄。另外,腳本不應該阻止寫入這些表。有人可以幫我查詢刪除表中的孤立記錄

我使用SQL Server 2014

+0

我正在尋找更多性能優化腳本 –

+0

您可以考慮將來使用'DELETE CASCADE'關係。這將允許您從「Table1」中刪除而不先刪除「其他表」數據。主要的刪除然後傳播通過相關的表,從'Table1'刪除被刪除的主要行所引用的行[ – Kritner

+0

] [如何從第二個表中刪除'孤立的'記錄](http://stackoverflow.com /問題/ 27963398 /如何到刪除孤兒 - 記錄 - 從秒錶) –

回答

0

這是您可以使用自動化這些步驟是我現在想:

SET NOCOUNT ON 

DECLARE @totalcnt INT 
     ,@Batch INT = 1000 

IF OBJECT_ID('tempdb..#TEMPWrk') IS NOT NULL 
    DROP TABLE #TEMPWrk 

IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL 
    DROP TABLE #TEMP 

CREATE TABLE #TEMP (TableKey int NOT NULL PRIMARY KEY) 
CREATE TABLE #TEMPWrk (TableKey int NOT NULL PRIMARY KEY) 

INSERT INTO #TEMP 
SELECT 
    A.TableKey 
FROM 
    dbo.Table1 A 
     LEFT JOIN (
        SELECT TableKey FROM dbo.Table2 UNION 
        SELECT TableKey FROM dbo.Table3 UNION 
        SELECT TableKey FROM dbo.Table4 UNION 
        SELECT TableKey FROM dbo.Table5 UNION 
        SELECT TableKey FROM dbo.Table6 UNION 
        SELECT TableKey FROM dbo.Table7 UNION 
        SELECT TableKey FROM dbo.Table8 
        ) T ON T.TableKey = A.TableKey 
WHERE 
    T.TableKey IS NULL 


SELECT 
    @totalcnt = COUNT(*) 
FROM 
    #TEMP 

WHILE (@totalcnt > 0) 
BEGIN 
    PRINT @totalcnt 
    DELETE TOP (@batch) 
    FROM 
     #TEMP 
    OUTPUT DELETED.TableKey INTO #TEMPWrk 

    DELETE T 
    FROM 
     dbo.Table1 T 
      JOIN #TEMPWrk A ON T.TableKey = A.TableKey 

    DELETE FROM #TEMPWrk 

    SELECT 
     @totalcnt = COUNT(*) 
    FROM 
     #TEMP 
END 

SET NOCOUNT OFF 
0

我做了類似的刪除如下:

  1. 確定在刪除表聚簇索引鍵並在10K到100K批量刪除基於硬件場景。
  2. 如果您在這些表上有觸發器,CT,CDC,索引視圖,那麼我們需要在刪除過程中刪除或禁用,這會使刪除速度更快。
  3. 在刪除操作過程中,我將「恢復模式」設置爲SIMPLE。
  4. 在一些批次的刪除過程中調用顯式「檢查點」。

對於任何給定的情況下,如果你不能做任何的PROD上面的步驟,然後在線刪除會比較慢分別

0

由於有兩個表中的交易,並儘量減少鎖定,就可以申請原則分而治之

1-得到表1(父表)

2 - 運行分階段下面的腳本,例如每次迭代

十萬行的最大ID
DELETE FROM tabl2 t2 
WHERE t2.id < 100000 
AND t2.id IN (SELECT t1.id FROM table1 t1) 

3-其他範圍

where t2.id BETWEEN 100001 AND 200000 

最長至ID

重複步驟2 while語句