译者 林锦森 · 沃趣科技数据库技术专家
出品 沃趣科技
在Part 1中我们了解了两种获取执行计划的方式,第一种是优化器预测它将会怎么执行,通过以下方法查询获取:
explain plan for {
sql statement}
select * from table(dbms_xplan.display);
第二种是优化器在我们执行语句后真正的执行路径,通过以下方法查询获取:
set serveroutput off
{
sql statement}
select * from table(dbms_xplan.display_cursor);
事实上,在Part 1中,我故意使用两种获取执行计划的方法,来证明对同一条存在绑定变量的语句可以生成两种截然不同的执行计划。
Part 2中我们会评估几种查看真实执行计划的方法,但是首先我们关注目前我们接触到函数的其他调用选项,这会使我们对执行计划在最终用户的环境中的复现更加自信。
Format Options
一般来说,如果想要执行计划与最终用户环境一致的话,我们需要他们生产数据的备份,对应的统计信息,系统的参数还有一致的输入。 生产数据以及统计信息一般都是一样的,所以我们真正需要关注的就是客户环境是否不同以及语句输入; 我们可以通过数据库来帮助我们获取在某一刻的执行信息。 这里也有一个小提醒,需要注意数据、统计信息还有谓词条件的及时同步。 举个例子,如果你的生产数据是好几个星期前的,那么你执行语句时要根据几个星期前用户当时执行的语句去执行; 因为如果条件中存在SYSDATE,那么就不能很好的模拟当时的环境。 在Part 1中提到过的,调用dbms_xplan.display_cursor()可以赋值三个参数,它们分别是sql_id,child_number和formatting option。 有两个formatting option参数能有效的帮助你解决最近一次出现的问题,"peeked_binds"和"outline"。 前者会列出(只需要一点运气)优化查询时使用的真实的值,后者会提供一个hint的列表,如果我们为了这个查询创建了一个存储大纲或者SQL Plan Baseline,通过这些hint我们可以发现优化器的环境是否不同。 这里有个小例子,通过对视图dba_extents的copy表的查询来演示使用和输出。alter session setworkarea_size_policy = manual;
alter session setsort_area_size = 10485760;
alter session setoptimizer_mode = first_rows_10;
alter session set"_hash_join_enabled" = false;
set serveroutput off
variable m_owner varchar2(32)
variable m_object varchar2(32)
execute :m_owner :='TEST_USER&#