【发布时间】:2018-01-02 01:13:03
【问题描述】:
我有一个这样的(简化的)查询:
SELECT DISTINCT this_.person_id AS y0_
FROM coded_entity this_
WHERE this_.code = ?
AND this_.tenant_id = ?
AND this_.person_id IN (SELECT person_id
FROM person that
WHERE that.date_voided IS NULL
AND that.ssn = ?
AND that.tenant_id = ? )
我希望能够强制 Oracle 始终首先执行最里面的子查询,因为我知道它总是更具选择性。代码只有几个值,而 ssn 的值要多得多。每个表的行数都相同。
但是,在实际实践中,有时 Oracle CBO 决定先执行 coded_entity 查询,从而导致时间慢得多。
有没有办法在不将查询拆分为单独调用的情况下强制执行此行为?
【问题讨论】:
-
您是否考虑过使用基数提示?
-
收集数据,Oracle没那么傻,exec计划不稳定一定是有原因的。否则,作为最后的手段,您可以使用 CARNALITY、MATERIALIZE 或 NO_PUSH_PRED 提示
-
“person_id”列是person表的主键吗?
-
恕我直言,您应该从 GATHER_PLAN_STATISTICS 开始推断优化估计错误的地方。
-
顺便说一句,jonathan lewis 做了一系列关于阅读/分析执行计划和这个特定条目 allthingsoracle.com/execution-plans-part-6-pushed-subqueries 的系列文章,他在其中介绍了两个查询提示,其意图与您相同:/*+ no_unnest push_subq * /
标签: sql database oracle sql-execution-plan sql-optimization