oracle日常运维笔记

Oracle日常运维笔记

  • 1.解析rowid含义:  

select /*hello>*/ rowid,obj.* from obj where object_id>91990;
ROWID                       OWNER                          OBJECT_NAME
---------------------  ----------------------------- -------------------
AAAWdnAAIAAAPl5AAn           DBMGR                          DBLIST  

rowid是oracle比较重要的一个伪列,一旦数据生成 rowid就生成了,以后都不会改变。rowid包含的信息比较重要,我们可以通过如下函数来解析rowid信息:

select dbms_rowid.rowid_object(rowid) object_id,
         dbms_rowid.rowid_relative_fno(rowid) file_id,
         dbms_rowid.rowid_block_number(rowid) block_id,
         dbms_rowid.rowid_row_number(rowid) row_num 
   from dblist 
   where rownum=1;

    OBJECT_ID    FILE_ID   BLOCK_ID        row_num 
---------- ---------- ---------- ----------
     91990          1      97201         37

从上可知对象编号,文件id,快id和行id,这样就能精准的定位到数据。

  • 2.获取sql执行计划:

我一般比较喜欢使用

dbms_xplan.display_cursor(sql_id,child_cursor_number,'advanced')

包获取执行计划。

执行一条sql语句 :

select * from dblist_test where host1_ip='XX.XX.XX.XX';


获取sql_id:

select sql_id,sql_text,CHILD_NUMBER from v$sql where sql_text like '%hello%';

打出执行计划:

select * from table(dbms_xplan.display_cursor('52gdzd1gbfydg',0,'advanced'));


这里解释一下索引范围扫描和索引唯一扫描的区别:

  • index_range_scan:

非唯一索引(主键)或者 非等值查询或者返回多行数据的情况下都会走索引范围扫描。队索引列有一个自动排序的操作。

SQL> create index obj_name_idx on obj(object_name);
SQL> select /*dblist*/ rowid,obj.* from obj where object_name='DBLIST';

SQL> select sql_id,sql_text,CHILD_NUMBER from v$sql where sql_text like '%dblist%';
SQL_ID        SQL_TEXT                                                                         CHILD_NUMBER
------------- -------------------------------------------------------------------------------- ------------
aymsbqzp6ga3q select /*dblist*/ rowid,obj.* from obj where object_name='DBLIST'                           0
SQL> select * from table(dbms_xplan.display_cursor('aymsbqzp6ga3q',0,'advanced'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  aymsbqzp6ga3q, child number 0
-------------------------------------
select /*dblist*/ rowid,obj.* from obj where object_name='DBLIST'
Plan hash value: 1298327290
--------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |       |       |     4 (100)
|   1 |  TABLE ACCESS BY INDEX ROWID| OBJ          |     1 |   219 |     4   (0)
|*  2 |   INDEX RANGE SCAN          | OBJ_NAME_IDX |     1 |       |     3   (0)
--------------------------------------------------------------------------------

 

  • index_unique_scan:

只发生在唯一键值索引上等值查询,返回单行数据
例如:

SQL> alter table obj add  primary key (object_id);
Table altered
SQL> select owner,index_name,TABLE_NAME from dba_indexes where table_name='OBJ';
OWNER                          INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------ ------------------------------
DBMGR                          SYS_C0012520                   OBJ
DBMGR                          OBJ_NAME_IDX                   OBJ

SQL> exec dbms_stats.gather_table_stats('dbmgr','obj');
SQL> exec dbms_stats.gather_index_stats('dbmgr','SYS_C0012520');
SQL> select /*hello*/ rowid,obj.* from obj where object_id=91990;

SQL> select sql_id,sql_text,CHILD_NUMBER from v$sql where sql_text like '%hello%';
SQL_ID        SQL_TEXT                                                                         CHILD_NUMBER
------------- -------------------------------------------------------------------------------- ------------
52gdzd1gbfydg select /*hello*/ rowid,obj.* from obj where object_id=91990                                 0

SQL> select * from table(dbms_xplan.display_cursor('52gdzd1gbfydg',0,'advanced'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  52gdzd1gbfydg, child number 0
-------------------------------------
select /*hello*/ rowid,obj.* from obj where object_id=91990
Plan hash value: 288971904
--------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |       |       |     2 (100)
|   1 |  TABLE ACCESS BY INDEX ROWID| OBJ          |     1 |   219 |     2   (0)
|*  2 |   INDEX UNIQUE SCAN         | SYS_C0012520 |     1 |       |     1   (0)
--------------------------------------------------------------------------------
  • 索引全扫描(index full scan):

当系统CBO评估索引全扫描比全表扫描更有效时会进行index full scan,而且此时查询的结果都必须从索引中可以直接得到。

一般在什么情况下会进行索引全扫描?

排序合并操作SMJ(sort-merge join),由于牵扯到排序操作,因为索引是有序的,这个时候如果要排序的字段上有索引,那么会进行SMJ。

如果order by、group by的字句中的列存在索引的情况下也会SMJ。

与全表扫描相比,索引全扫描得出的数据是有序的。不过全表扫描可以走多块并行读,其效率也是蛮可观的。

/*+ index_fs(dblist obj_idx ) */

  • 索引快速全扫描(index fast full scan):

扫描索引中所有快,与index full scan 类似,唯一区别不对结果集排序,这种方式可以开启多块并行读,以便获取最大的I/O。

/*+ index_ffs(dblist obj_idx) */

  • 索引跳跃扫描(index skip scan ):

发生在复合索引上,如果where条件字句中只包含复合索引部分列(非引导列),且引导列的distinct非常小,可能会发生index skip scan。

当然也可以使用hints来强制走index skip scan , /*+ index_ss(dblist obj_idx) */,obj_idx为复合索引。

  • 索引组合扫描(index combine):

 

转载于:https://my.oschina.net/u/3862440/blog/1924010

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值