译者 林锦森 · 沃趣科技数据库技术专家
出品 沃趣科技
在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
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'
execute :m_object := 'T1'
select /*+ tracking */ * from t1
where owner = :m_owner
and segment_name =:m_object
order by extent_id;
select * from table(
dbms_xplan.display_cursor(null,null,'outlinepeeked_binds')
);
SQL_ID 0wwbn4bhvrrxj, child number 0
-------------------------------------
select /*+ tracking */ * from t1 where owner = :m_owner and
segment_name = :m_object order by extent_id
Plan hash value: 3684778271
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | SORT ORDER BY | | 1 | 65 | 3 (34)| 00:00:01 |
|* 2 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 65 | 2 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | T1_I2 | 2 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
FIRST_ROWS(10)
OUTLINE_LEAF(@"SEL$1")
INDEX_RS_ASC(@"SEL$1" "T1"@"SEL$1" ("T1"."SEGMENT_NAME"))
END_OUTLINE_DATA
*/
Peeked Binds (identified by position):
--------------------------------------
1 - :M_OWNER (VARCHAR2(30), CSID=178): 'TEST_USER'
2 - :M_OBJECT (VARCHAR2(30), CSID=178): 'T1'
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OWNER"=:M_OWNER)
3 - access("SEGMENT_NAME"=:M_OBJECT)
column sql_id new_valuem_sql_id
column child_number new_valuem_child_no
select sql_id,child_number, sql_text
from v$sql
where sql_textlike '%tracking%'
and sql_text not like '%v$sql%'
;
select * from table(
dbms_xplan.display_cursor('&m_sql_id',&m_child_no,'outlinepeeked_binds')
);
select
name, value
from
v$sql_optimizer_env
where
sql_id = '&m_sql_id'
and child_number =&m_child_no
and isdefault = 'NO'
;
NAME VALUE
-----------------------------------------------------------------
hash_area_size 20971520
sort_area_size 10485760
optimizer_mode first_rows_10
_hash_join_enabled false
workarea_size_policy manual
_smm_auto_cost_enabled false
select * from table(
dbms_xplan.display_awr('9yaqj3djhwxa2',null, null,'outline peeked_binds')
);
executedbms_workload_repository.add_colored_sql({sql_id})
--
-- 输出当前被标记的语句
--
select * fromwrm$_colored_sql;
--
-- 解除语句标记
--
executedbms_workload_repository.remove_colored_sql({sql_id})
| 译者简介
相关链接
MySQL 一个让你怀疑人生的hang死现象
揭秘 MySQL 主从环境中大事务的传奇事迹
MySQL 执行DDL语句 hang住了怎么办?
手把手教你认识OPTIMIZER_TRACE
MySQL行级别并行复制能并行应用多少个binlog group?
binlog server还是不可靠吗?
MySQL binlog基于时间点恢复数据失败是什么鬼?
开源监控系统Prometheus的前世今生
prometheus监控多个MySQL实例
MySQL问题两则
Kubernetes scheduler学习笔记
执行计划-1:获取执行计划
大数据量删除的思考(四)
大数据量删除的思考(三)
大数据量删除的思考(二)
大数据量删除的思考(一)
统计信息记录表|全方位认识 mysql 系统库
数据库对象信息记录表|全方位认识 mysql 系统库
访问权限控制系统|全方位认识 mysql 系统库
权限系统表 | 全方位认识 mysql 系统库
Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part One
Oracle RAC Cache Fusion 系列十二:Oracle RAC Enqueues And Lock Part 3
Oracle RAC Cache Fusion 系列十一:Oracle RAC Enqueues And Lock Part 2
Oracle RAC Cache Fusion 系列十:Oracle RAC Enqueues And Lock Part 1
更多干货,欢迎来撩~