【发布时间】:2018-04-30 21:03:19
【问题描述】:
我有一个与 5 个表连接的查询,它在大约 0.2 秒内执行以从我的数据库中检索 36 条记录。下面附上解释计划的分析,你可以看到即使那些已经带有索引的表仍然存在全表访问。
如果有必要,是否需要对查询进行微调,如下所示?
SELECT
CASE WHEN DS.NAME = 'InteractiveCustomer' THEN 'NA' ELSE CUS.SOURCE_SYSTEM END AS SOURCE_SYSTEM,
OU.ORGUNIT_CODE AS ORGANIZATION_UNITS,
SUM(
CASE WHEN WS.NAME = 'Pending Autoclosure' THEN 1 ELSE 0 END
) AS PENDING_AUTOCLOSURE,
SUM(
CASE WHEN WS.NAME = 'New' THEN 1 ELSE 0 END
) AS NEW,
SUM(
CASE WHEN WS.NAME = 'Under Investigation' THEN 1 ELSE 0 END
) AS UNDER_INVESTIGATION,
SUM(
CASE WHEN WS.NAME = 'Escalated' THEN 1 ELSE 0 END
) AS ESCALATED,
SUM(
CASE WHEN WS.NAME = 'Recommend True Positive' THEN 1 ELSE 0 END
) AS RECOMMEND_TRUE_POSITIVE,
SUM(
CASE WHEN WS.NAME = 'Reopen Under Investigation' THEN 1 ELSE 0 END
) AS REOPEN_UNDER_INVESTIGATION
FROM
WORKFLOW_STATUSES WS
JOIN WORKFLOW_WORKITEM WW ON WS.ID = WW.STATUS_ID
JOIN WLM_ALERT_HEADER WAH ON WW.ENTITY_KEY = WAH.ALERT_KEY
INNER JOIN ORGANIZATION_UNITS OU ON OU.ID = WAH.CUSTOMER_ORGUNIT_ID
LEFT JOIN CUSTOMERS CUS ON CUS.CUSTOMER_ID = WAH.CUSTOMER_ID
INNER JOIN DATA_SOURCE DS ON WAH.AT_DATASOURCE_ID = DS.ID
WHERE
WW.ENTITY_NAME = 'WLM Alert'
GROUP BY
OU.ORGUNIT_CODE,
CUS.SOURCE_SYSTEM,
DS.NAME;
【问题讨论】:
-
我几乎看不懂解释计划,而且您从未在问题中包含您的查询。
-
基数很小。要么你的数据太少,索引不重要,要么你的统计数据是错误的/过时的。
-
更新了问题中的查询
-
你可能是对的,数据库中只有 2604 条记录,分别对应 WS.NAME 和 WW.ENTITY_NAME。查询是列出这些记录的统计数据。
-
运行一些查询以将相关表中的数据量放大一百万,然后再次运行它以测试其扩展方式。返回少量行的 0.2 秒不足以进行性能评估 - 0.19 秒可能是 tcp 连接设置、查询分析和重写以及通过网络进行数据分流
标签: sql oracle sql-execution-plan