Oracle SQL EXPLAIN PLAN - 完全 table 访问权限
Oracle SQL EXPLAIN PLAN - full table access
我有一个连接了 5 table 秒的查询,它以大约 0.2 秒的运行时间执行,从我的数据库中检索了 36 条记录。下面附上解释计划的分析,你可以看到即使那些 table 已经带有索引,完整的 table 访问仍然发生。
是否有必要按如下方式微调查询?
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;
完全 table 访问仍可能发生在具有索引的 table 上,即使查询使用索引列只是因为查询优化器可能认为如果更快地 blat 整个 table 将数据存入内存,而不是间接访问索引,查找相关行,然后从磁盘中取出它们
全面 table 扫描不一定是坏事,但如果查询过长 运行ning 并且怀疑是由于 FTS一个非常大的table。在小tables 上,完整扫描是微不足道的
您询问是否有必要微调查询 - 我个人对此的看法是“不,现阶段不需要” - 根据我的评论,将相关数据 tables 提高一百万行,然后 运行 再次了解它将如何缩放。您可能会得到一个完全不同的计划。即使它最终 运行ning 持续了 5 秒,也要将其与产品中要求此数据的次数进行平衡——如果是每 10 秒,那么当然,请对此采取一些措施。如果是每个月一次,客户团队发出发票,即使需要一分钟也不要理会
“过早的优化是万恶之源”
我有一个连接了 5 table 秒的查询,它以大约 0.2 秒的运行时间执行,从我的数据库中检索了 36 条记录。下面附上解释计划的分析,你可以看到即使那些 table 已经带有索引,完整的 table 访问仍然发生。
是否有必要按如下方式微调查询?
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;
完全 table 访问仍可能发生在具有索引的 table 上,即使查询使用索引列只是因为查询优化器可能认为如果更快地 blat 整个 table 将数据存入内存,而不是间接访问索引,查找相关行,然后从磁盘中取出它们
全面 table 扫描不一定是坏事,但如果查询过长 运行ning 并且怀疑是由于 FTS一个非常大的table。在小tables 上,完整扫描是微不足道的
您询问是否有必要微调查询 - 我个人对此的看法是“不,现阶段不需要” - 根据我的评论,将相关数据 tables 提高一百万行,然后 运行 再次了解它将如何缩放。您可能会得到一个完全不同的计划。即使它最终 运行ning 持续了 5 秒,也要将其与产品中要求此数据的次数进行平衡——如果是每 10 秒,那么当然,请对此采取一些措施。如果是每个月一次,客户团队发出发票,即使需要一分钟也不要理会
“过早的优化是万恶之源”