从表中删除孤立记录[关闭]

Posted

技术标签:

【中文标题】从表中删除孤立记录[关闭]【英文标题】:Deleting Orphan Records from a table [closed] 【发布时间】:2016-08-30 20:20:00 【问题描述】:

我有一个表(比如 Table1),它的主键与其他 10 个表有外键关系。所有这些表都有数百万条数据。我需要以高效的方式从 Table1 中删除所有孤立记录。此外,脚本不应阻止对这些表的写入。有人可以帮我查询吗

我使用的是 SQL Server 2014

【问题讨论】:

我正在寻找性能更优化的脚本 以后可以考虑DELETE CASCADE关系。这将允许您从Table1 中删除,而无需先删除“10 个其他表”数据。然后,主数据库上的删除将通过相关表传播,从Table1 中删除被删除的主行引用的行 How to delete 'orphaned' records from second table的可能重复 【参考方案1】:

我做了类似的删除如下:

    在删除表上识别clustered Index Key,根据硬件场景分10k到100k批量删除。 如果您在这些表上有触发器、CT、CDC、索引视图,那么我们需要在删除期间删除或禁用,这将使删除速度更快。 我在删除操作期间将“恢复模式”设置为 SIMPLE。 在某些批量删除过程中调用显式“检查点”。

对于任何给定的场景,如果不允许您在 PROD 中执行上述任何步骤,则在线删除将分别变慢

【讨论】:

【参考方案2】:

由于两个表中都有事务,为了尽量减少锁定,您可以应用分而治之的原则

1-获取表1(父表)的最大id

2- 分阶段运行以下脚本,例如每次迭代 100000 行

DELETE FROM tabl2  t2
WHERE  t2.id  < 100000
AND    t2.id  IN (SELECT t1.id FROM table1 t1)

3- 对其他范围重复步骤 2

    where  t2.id BETWEEN  100001 AND 200000 

最大 id

您可以使用 while 语句自动执行这些步骤

【讨论】:

【参考方案3】:

这就是我现在正在尝试的:

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

【讨论】:

以上是关于从表中删除孤立记录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

如何从表和所有引用中删除数据? [关闭]

如何使用jquery删除mysql记录[关闭]

如何从表中检索票数最高的候选人姓名[关闭]

R从表中提取公式并在函数中使用[关闭]

如何从表中删除重复记录? [复制]