私はSQL 2000を使用しています。複雑な条件セットに基づいて不要な重複をすべて削除できるようになりましたが、クエリには約3.5分かかりました重複を含むデータを取得します。この重複削除クエリを最適化するにはどうすればよいですか?
クラリティの場合: rpt.HostNameフィールドまたはrpt.SystemSerialNumberフィールドのいずれかが異なる場合は、重複するrpt.Nameフィールドを持つことができます。また、いくつかの列にタイムスタンプがないため、4つの異なる列のタイムスタンプに基づいて保持するエントリを決定する必要があります。
ご協力いただきありがとうございます。
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句を使用する代わりにキーワードDISTINCTを使用して重複を削除しようとしましたか? –
Dan、あなたは、重複の定義がクエリが返すフィールドのセットに正確に基づいていると仮定しています。合理的な前提ですが、これは必ずしも真実ではありません。 –