SQL 2000을 사용하고 있습니다. 복잡한 기준에 따라 원하지 않는 복제본을 모두 제거 할 수있는 지점을 얻었지만 이제는 약 3.5 분이 걸렸을 때 쿼리를 완료하는 데 몇 시간이 걸립니다. 포함 된 사본으로 데이터를 가져옵니다.이 중복 제거 쿼리는 어떻게 최적화 할 수 있습니까?
투명도 : rpt.HostName 또는 rpt.SystemSerialNumber 필드가 다른 경우 중복 rpt.Name 필드가있을 수 있습니다. 또한, 일부 열의 시간 소인이 없어서 네 개의 다른 열의 시간 소인을 기반으로 유지할 항목을 결정해야합니다.
도움을 주시면 대단히 감사하겠습니다. 그 라인을 따라
SELECT
rpt.[Name],
rpt.LastAgentExecution,
rpt.GroupName,
rpt.PackageName,
rpt.PackageVersion,
rpt.ProcedureName,
rpt.HostName,
rpt.SystemSerialNumber,
rpt.JobCreationTime,
rpt.JobActivationTime,
rpt.[Job Completion Time]
FROM DSM_StandardGroupMembersProcedureActivityViewExt rpt
WHERE
(
(
rpt.GroupName = 'Adobe Acrobat 7 Deploy'
OR rpt.GroupName = 'Adobe Acrobat 8 Deploy'
)
AND
(
(rpt.PackageName = 'Adobe Acrobat 7' AND rpt.PackageVersion = '-1.0')
OR (rpt.PackageName = 'Adobe Acrobat 8' AND rpt.PackageVersion = '-3.0')
)
)
AND NOT EXISTS
(
SELECT *
FROM DSM_StandardGroupMembersProcedureActivityViewExt rpt_dupe
WHERE
(
(
rpt.GroupName = 'Adobe Acrobat 7 Deploy'
OR rpt.GroupName = 'Adobe Acrobat 8 Deploy'
)
AND
(
(rpt.PackageName = 'Adobe Acrobat 7' AND rpt.PackageVersion = '-1.0')
OR (rpt.PackageName = 'Adobe Acrobat 8' AND rpt.PackageVersion = '-3.0')
)
AND
(
(rpt_dupe.[Name] = rpt.[Name])
AND
(
(rpt_dupe.SystemSerialNumber = rpt.SystemSerialNumber)
OR (rpt_dupe.HostName = rpt.HostName)
)
AND
(
(rpt_dupe.LastAgentExecution < rpt.LastAgentExecution)
OR (rpt_dupe.JobActivationTime < rpt.JobActivationTime)
OR (rpt_dupe.JobCreationTime < rpt.JobCreationTime)
OR (rpt_dupe.[Job Completion Time] < rpt.[Job Completion Time])
)
)
)
)
실제 실행 계획의 스크린 샷을 게시하십시오 (권장되지 않는 것이 좋음). – usr
바보 같은 코멘트 일지 모르지만 NOT EXISTS 절 대신 duplicate를 제거하기 위해 DISTINCT 키워드를 사용해 보셨습니까? –
Dan, 그의 중복 정의는 쿼리가 반환하는 필드 집합을 기반으로한다고 가정합니다. 합리적인 가정이지만 이것이 반드시 사실 일 수는 없습니다. –