这与我们面临的涉及表和视图(具有70+百万条记录)的联接的查询所面临的性能问题有关。
在围绕不同环境下的执行计划进行了广泛的分析之后,我可以将其指向其中一个联接的VIEW PUSHED PREDICATE分支。
执行次数(执行计划的“开始”列)等于驱动/外部表上返回的行数-可能是在评估外部结果集上的每个匹配项的视图。
由于此处涉及的表具有数百万条记录,因此%CPU和总体执行时间变得非常糟糕。如果我添加了不推送谓词的提示,则不是这种情况(no_push_pred); 处决只有1。
VIEW PUSHED PREDICATE是否需要此功能,或者我是否对此缺少任何概念?
Oracle数据库版本:12c企业版12.1.0.2.0
我尝试使用简单的查询来模拟问题(或行为)-请在下面查看详细信息。
注意:在此处添加了no_merge提示,以确保Optimizer在联接期间不会合并视图,因此该计划与我的实际查询的计划相同。
查询:
SELECT
v.STATUS_CODE,
a1.STATUS_DESC
FROM STATUS_DETAIL a1,
(select /*+ no_merge push_pred */
a2.STATUS_CODE
from STATUS a2
where a2.STATUS_CODE < 50) v
where a1.STATUS_CODE = v.STATUS_CODE;
Run Code Online (Sandbox Code Playgroud)
执行计划(使用TABLE(DBMS_XPLAN.display_cursor)提取):
我指的是计划中的3号和4号线-“开始”列的值为70(等于2号线的A-Rows列的值-驱动表访问)
-----------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 213 (100)| | 22 |00:00:00.01 …Run Code Online (Sandbox Code Playgroud)