我有一個表(比如表1),其主鍵與其他10個表有外鍵關係。所有這些表都有數百萬的數據。我需要以性能有效的方式刪除Table1中的所有孤立記錄。另外,腳本不應該阻止寫入這些表。有人可以幫我查詢刪除表中的孤立記錄
我使用SQL Server 2014
我有一個表(比如表1),其主鍵與其他10個表有外鍵關係。所有這些表都有數百萬的數據。我需要以性能有效的方式刪除Table1中的所有孤立記錄。另外,腳本不應該阻止寫入這些表。有人可以幫我查詢刪除表中的孤立記錄
我使用SQL Server 2014
這是您可以使用自動化這些步驟是我現在想:
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
我做了類似的刪除如下:
對於任何給定的情況下,如果你不能做任何的PROD上面的步驟,然後在線刪除會比較慢分別
由於有兩個表中的交易,並儘量減少鎖定,就可以申請原則分而治之
1-得到表1(父表)
2 - 運行分階段下面的腳本,例如每次迭代
十萬行的最大IDDELETE 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語句
我正在尋找更多性能優化腳本 –
您可以考慮將來使用'DELETE CASCADE'關係。這將允許您從「Table1」中刪除而不先刪除「其他表」數據。主要的刪除然後傳播通過相關的表,從'Table1'刪除被刪除的主要行所引用的行[ – Kritner
] [如何從第二個表中刪除'孤立的'記錄](http://stackoverflow.com /問題/ 27963398 /如何到刪除孤兒 - 記錄 - 從秒錶) –