【问题标题】:Quicker way of finding duplicates in SQL Server在 SQL Server 中查找重复项的更快方法
【发布时间】:2013-05-02 17:52:05
【问题描述】:

我正在尝试找到一种在 SQL Server 中查找重复项的更好方法。在结果开始显示在 SSMS 的结果窗口中之前,这需要 20 多分钟才能运行超过 3 亿条记录。又过了 22 分钟,它才崩溃。

然后 SSMS 在显示 16,777,216 条记录后抛出此错误:

An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.

架构:

ENCOUNTER_NUM - numeric(22,0)
CONCEPT_CD - varchar(50)
PROVIDER_ID - varchar(50)
START_DATE - datetime
MODIFIER_CD - varchar(100)
INSTANCE_NUM - numeric(18,0)


SELECT
    ROW_NUMBER() OVER (ORDER BY f1.[ENCOUNTER_NUM],f1.[CONCEPT_CD],f1.[PROVIDER_ID],f1.[START_DATE],f1.[MODIFIER_CD],f1.[INSTANCE_NUM]),
    f1.[ENCOUNTER_NUM], 
    f1.[CONCEPT_CD], 
    f1.[PROVIDER_ID], 
    f1.[START_DATE], 
    f1.[MODIFIER_CD], 
    f1.[INSTANCE_NUM]
FROM
    [dbo].[I2B2_OBSERVATION_FACT] f1
    INNER JOIN [dbo].[I2B2_OBSERVATION_FACT] f2 ON
        f1.[ENCOUNTER_NUM] = f2.[ENCOUNTER_NUM] 
        AND f1.[CONCEPT_CD] = f2.[CONCEPT_CD]
        AND f1.[PROVIDER_ID] = f2.[PROVIDER_ID]
        AND f1.[START_DATE] = f2.[START_DATE]
        AND f1.[MODIFIER_CD] = f2.[MODIFIER_CD]
        AND f1.[INSTANCE_NUM] = f2.[INSTANCE_NUM]

【问题讨论】:

    标签: sql-server performance tsql duplicates i2b2


    【解决方案1】:

    不确定这有多快,但值得一试。

    SELECT
        COUNT(*) AS Dupes,
        f1.[ENCOUNTER_NUM], 
        f1.[CONCEPT_CD], 
        f1.[PROVIDER_ID], 
        f1.[START_DATE], 
        f1.[MODIFIER_CD], 
        f1.[INSTANCE_NUM]
    FROM
        [dbo].[I2B2_OBSERVATION_FACT] f1
    GROUP BY
        f1.[ENCOUNTER_NUM], 
        f1.[CONCEPT_CD], 
        f1.[PROVIDER_ID], 
        f1.[START_DATE], 
        f1.[MODIFIER_CD], 
        f1.[INSTANCE_NUM]
    HAVING
        COUNT(*) > 1
    

    【讨论】:

    • 使用合适的索引应该很快
    • +1,但我会使用COUNT(*) 而不是COUNT(1) ...这对您正在做的事情更明确...计算行数。
    • +1 300M x 300M 连接不是开玩笑,除非您将它作为合并连接运行,这需要一个非常具体的索引。这应该更快!
    • 我应该澄清一下。在 SSMS 开始显示结果之前,需要 20 分钟。它仍在尝试打印结果窗口中的所有内容。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多