【发布时间】:2022-01-14 02:14:21
【问题描述】:
SELECT
*
FROM
xxcpb_i45_06_interface_r
WHERE
trunc(creation_date) < trunc(sysdate) - 2
AND ( ( request_id < (
SELECT
MAX(xcs_sub.request_id)
FROM
xxcpb_i45_06_interface_r xcs_sub
WHERE
xcs_sub.status = 'PROCESSED'
AND xcs_sub.file_id = 'CBS1330'
)
AND file_id = 'CBS1330' )
OR ( request_id < (
SELECT
MAX(xcs_sub.request_id)
FROM
xxcpb_i45_06_interface_r xcs_sub
WHERE
xcs_sub.status = 'PROCESSED'
AND xcs_sub.file_id = 'CCI1330'
)
AND file_id = 'CCI1330' ) )
- 说明计划显示成本 = 37061
- 我尝试在 where 子句中使用但不起作用的列上创建索引。
【问题讨论】:
-
Cost 只是 IMO 不是调整的最佳起点。显示完整的execution plan 和有关您的表的其他信息(如果它是表而不是视图),以便提供更有针对性的答案;不是一个糟糕的猜测。
-
我们不知道您的标准有多严格。
trunc(creation_date) < trunc(sysdate) - 2可以优化为creation_date < trunc(sysdate) - 2。而且这似乎会影响表中的几乎所有行(除了最近三天之外的所有行)。表中通常有多少天?然后,您只考虑文件 ID CBS1330 和 CCI1330。表中有多少个不同的文件 ID?最后,有多少百分比的行状态为 PROCESSED?表格有多少行?您希望查询返回多少行? -
“成本”只是优化器用来比较给定语句的几种可能访问计划的预期性能的人造数字。如果您的查询没有像您希望的那样快速运行,请忘记查看“成本”并专注于 EXPLAIN PLAN 以及可能的 sql 跟踪以查看时间的去向。并考虑甚至可以挤出多少。如果查询已经以亚秒级的速度运行,那么将时间减少 50% 需要付出多少努力?
标签: sql oracle query-optimization