【发布时间】:2014-12-10 22:27:45
【问题描述】:
我有一个包含 3 个子报表和几个要在每个报表中优化的查询的报表。第一个在 WHERE 分支中有几个 OR 子句,并且 OR 正在通过拉取子查询的 IN 选项进行过滤。
我说这主要来自阅读this SO post。特别是 LBushkin 的第二点。
我在 TSQL 方面不是最出色的,但我知道这足以认为这是非常低效的。我想我需要做两件事。
我知道我需要为相关表添加索引。
我认为查询可以大大增强。
看来我的第一步是改进查询。从那里我可以查看涉及哪些列和表,从而确定索引。
此时我还没有发布表架构,因为我正在寻找更多选项/注意事项,例如使用 cte 替换所有 IN 子查询。
如果需要,我一定会发布任何有用的信息,例如物理阅读等。
SELECT DISTINCT
auth.icm_authorizationid,
auth.icm_documentnumber
FROM
Filteredicm_servicecost AS servicecost
INNER JOIN Filteredicm_authorization AS auth ON
auth.icm_authorizationid = servicecost.icm_authorizationid
INNER JOIN Filteredicm_service AS service ON
service.icm_serviceid = servicecost.icm_serviceid
INNER JOIN Filteredicm_case AS cases ON
service.icm_caseid = cases.icm_caseid
WHERE
(cases.icm_caseid IN
(SELECT icm_caseid FROM Filteredicm_case AS CRMAF_Filteredicm_case))
OR (service.icm_serviceid IN
(SELECT icm_serviceid FROM Filteredicm_service AS CRMAF_Filteredicm_service))
OR (servicecost.icm_servicecostid IN
(SELECT icm_servicecostid FROM Filteredicm_servicecost AS CRMAF_Filteredicm_servicecost))
OR (auth.icm_authorizationid IN
(SELECT icm_authorizationid FROM Filteredicm_authorization AS CRMAF_Filteredicm_authorization))
【问题讨论】:
-
我相信您可以删除所有
where条件,并且您应该得到与引用原始表相同的结果(case to case、service to service、servicecost to servicecost和 @ 987654327@)
标签: sql-server sql-server-2008 tsql