2013-05-02 2 views
0

SQL Server에서 중복 된 항목을 찾는 더 나은 방법을 찾으려고합니다. 결과가 SSMS 내의 결과 창에 표시되기 전에 20 분이 걸렸습니다. 추락하기 전에 22 분이 경과했습니다. SQL Server에서 중복 된 항목을 빨리 찾는 방법

그런 다음 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] 

답변

8

이 얼마나 빨리 확인하지만, 가치가 시도.

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 
+0

적절한 인덱스가 – Phil

+2

+1 꽤 빨리해야한다,하지만 난'COUNT (*)를 사용하는 것이'대신 COUNT'(1)'... 당신이 무슨 일을하는지에 더 명시 적입니다. .. 행 수. – Matthew

+0

+1 300M x 300M 조인은 매우 구체적인 인덱스가 필요한 병합 조인으로 실행하지 않는 한 농담이 아닙니다. 이것은 훨씬 빨라야합니다! – Andomar

관련 문제