[20140621]Cluster Nulls.txt

[20140621]Cluster Nulls.txt

https://jonathanlewis.wordpress.com/2014/06/17/cluster-nulls/

重复测试:
SCOTT@test01p> @ver

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

drop table tc1;
drop cluster c including tables;
purge recyclebin;

create cluster c(val number);
create index c_idx on cluster c;
create table tc1 (val number, n1 number, padding varchar2(100)) cluster c(val);

insert into tc1
select
decode(rownum,1,to_number(null),rownum), rownum, rpad('x',100)
from
all_objects
where
rownum ;

insert into tc1 select * from tc1;
insert into tc1 select * from tc1;
insert into tc1 select * from tc1;
insert into tc1 select * from tc1;
insert into tc1 select * from tc1;
commit;

analyze cluster c compute statistics;
execute dbms_stats.gather_table_stats(user,'tc1');

set autotrace traceonly explain

select * from tc1 where val = 2;

SCOTT@test01p> select * from tc1 where val = 2;

Execution Plan
----------------------------------------------------------
Plan hash value: 3039613725

------------------------------------------------------------------------------
| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |    32 |  3424 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS CLUSTER| TC1   |    32 |  3424 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN  | C_IDX |     1 |       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("VAL"=2)

select * from tc1 where val is null;
SCOTT@test01p> select * from tc1 where val is null;

Execution Plan
----------------------------------------------------------
Plan hash value: 1199729187

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    32 |  3424 |    30   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TC1  |    32 |  3424 |    30   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("VAL" IS NULL)
--可以发现val is null选择的是全表扫描.

set autotrace off

create index tc1_null on tc1(nvl2(val,null,0));
execute dbms_stats.gather_table_stats(user,'tc1', method_opt=>'for all hidden columns size 1');
select * from tc1 where nvl2(val,null,0) = 0;

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  d1fns9ushrfa2, child number 0
-------------------------------------
select * from tc1 where nvl2(val,null,0) = 0

Plan hash value: 3636020997

------------------------------------------------------------------------------
| Id  | Operation                           | Name     | E-Rows | Cost (%CPU)|
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |          |        |     2 (100)|
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TC1      |     32 |     2   (0)|
|*  2 |   INDEX RANGE SCAN                  | TC1_NULL |     32 |     1   (0)|
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("TC1"."SYS_NC00004$"=0)

--建立函数索引才避免全表扫描.

2.看看索引的转储:
SCOTT@test01p> select object_name,object_id,data_object_id from dba_objects where owner=user and object_name='C_IDX';
OBJECT_NAME   OBJECT_ID DATA_OBJECT_ID
------------ ---------- --------------
C_IDX             95499          95499

SCOTT@test01p> alter session set events 'immediate trace name treedump level 95499';
Session altered.

*** 2014-06-21 20:42:41.711
----- begin tree dump
leaf: 0x24000db 37748955 (0: nrow: 100 rrow: 100)
----- end tree dump

Session altered.

SCOTT@test01p> @dfb 24000db
    RFILE#     BLOCK#
---------- ----------
         9        219

TEXT
------------------------------------------------
alter system dump datafile 9 block 219 ;

SCOTT@test01p> select segment_name,header_file,header_block from dba_segments where owner=user and segment_name='C_IDX';
SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
-------------------- ----------- ------------
C_IDX                          9          218

SCOTT@test01p> alter system dump datafile 9 block 219;
System altered.

Block header dump:  0x024000db
Object id on Block? Y
seg/obj: 0x1750b  csc: 0x00.602546  itc: 2  flg: E  typ: 2 - INDEX
     brn: 0  bdba: 0x24000d8 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0007.001.0000106f  0x014000e3.0247.10  --U-    1  fsc 0x0000.00602547
Leaf block dump
===============
header address 40390756=0x2685064
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 1
kdxcosdc 0
kdxconro 100
kdxcofbo 236=0xec
kdxcofeo 6738=0x1a52
kdxcoavs 6502
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 8
kdxlebksz 8036
row#0[8012] flag: -------, lock: 0, len=13, data:(8):  02 40 00 d6 00 00 01 00
col 0; len 2; (2):  c1 03
row#1[7999] flag: -------, lock: 0, len=13, data:(8):  02 40 00 d7 00 00 01 00
col 0; len 2; (2):  c1 04
...........
row#97[6751] flag: -------, lock: 0, len=13, data:(8):  02 40 01 72 00 00 01 00
col 0; len 2; (2):  c1 64
row#98[6738] flag: -------, lock: 2, len=13, data:(8):  02 40 01 73 00 00 01 00
col 0; len 2; (2):  c2 02
row#99[8025] flag: -------, lock: 0, len=11, data:(8):  02 40 00 d5 00 00 01 00
col 0; NULL
----- end of leaf block Logical dump -----
----- end of leaf block dump -----
End dump data blocks tsn: 3 file#: 9 minblk 219 maxblk 219

--可以发现索引是保存NULL的.但是执行val is null时不用该索引.

--取前4位16进制.
SCOTT@test01p> @dfb 024000d5
    RFILE#     BLOCK#
---------- ----------
         9        213

TEXT
------------------------------------------
alter system dump datafile 9 block 213 ;

SCOTT@test01p> select rowid,tc1.* from tc1 where val is null and rownumROWID                     VAL         N1 PADDING
------------------ ---------- ---------- ----------
AAAXUKAAJAAAADVAAA                     1 x

SCOTT@test01p> @lookup_rowid AAAXUKAAJAAAADVAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
     95498          9        213          0 9,213                alter system dump datafile 9 block 213 ;

--后面的00000100不知道表示什么?

时间: 2024-07-30 10:55:36

[20140621]Cluster Nulls.txt的相关文章

Hadoop 集群介绍

Understanding Hadoop Clusters and the Network September 10, 2011 by Brad Hedlund 72 Comments This article is Part 1 in series that will take a closer look at the architecture and methods of a Hadoop cluster, and how it relates to the network and serv

[20140909]oracle cluster index (11g).txt

[20140909]oracle cluster index (11g).txt --应用中除了堆表,很少使用cluser表,也就仅仅在生产系统使用IOT索引组织表. --实际上系统表中许多都是cluster表.比如SYS.TAB$,SYS.COL$等都建立在cluster中. --没事,简单研究一下其存储结构. 1.建立测试环境: SCOTT@test> @ver BANNER ----------------------------------------------------------

[20120507]视图all_tab_columns的定义问题.txt

[20120507]视图all_tab_columns的定义问题.txt 生产系统我发现一个问题,开发人员在使用pb9.0维护时要调用如下类似的语句: SELECT synonym_name  FROM SYS.all_synonyms s, SYS.all_tab_columns t WHERE s.owner IN ('SCOTT', 'PUBLIC')   AND s.synonym_name = 'DEPT'   AND s.table_owner = t.owner   AND s.t

Failed to upgrade Oracle Cluster Registry configuration(root.sh)

    最近在给客户基于Suse 11 sp3安装Oracle 10g RAC,在安装完clusterware执行/u01/app/crs/root.sh时收到错误提示,Failed to upgrade Oracle Cluster Registry configuration由于当前的环境使用了多路径,从Oracle的描述来看,这是一个Oracle Bug(4679769),如果你有相同的问题,请接着往下看. 一.故障现象suse11a:/u01/app/crs # /u01/app/crs

Tomcat集群Cluster实现原理剖析

在上一篇文章中简要介绍了如何通过简单的配置来实现tomcat集群,本文意在介绍对tomcat集群进行更深入详细的配置以满足特定需求.        对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.     要实现这一点,大体上有两种方式,           一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据:          

[20171115]关于namespace.txt

[20171115]关于namespace.txt --//第一次听到这个概念,好像是那篇blog提到,表与索引在不同的namespace里面.也就是在相同schema下建立的表可以与索引同名. --//而在同一schema下的namespace的建立的对象名字是不能重名的. --//前几天在测试dbms_shared_pool.pin时,发现SEQUENCE的namespace竟然是TABLE/PROCEDURE,感觉有必要做一些学习,了解这方面 --//的知识. --//摘要: http:/

[20170705]理解linux su命令.txt

[20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作 --//一般都加入 - 参数.这个已经成了条件反射...^_^. # man su       Change the effective user id and group id to that of USER. -, -l, --login make the shell a login shell --//也就是使用login里面的shell,设置

[20171115]恢复数据文件块头3补充.txt

[20171115]恢复数据文件块头3补充.txt --// 昨天做了恢复数据文件块头,通过备份文件直接取出文件块头,覆盖原来的数据块,然后修复. --//补充几点: --1.文件头损坏,无法使用rman的块恢复功能. --2.文件头损坏,dbv检查发现都是坏块.我感觉主要文件块头损坏,dbv无法定位其它剩下的块. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER --------

[20170615]直方图-高度直方图(11g).txt

[20170615]直方图-高度直方图(11g).txt --//昨天看了一些直方图的资料,重新看jonathanlewis写<CBO>书籍,在测试时遇到一些与原来书讲的不一样的地方. --//自己重复测试看看. 1.环境以及测试建立: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- --