[20171203]关于raw类型.txt

[20171203]关于raw类型.txt

--//从来没有关注raw类型,昨天看https://blog.dbi-services.com/doag-2017-avg_row_len-with-virtual-columns/
--//我第一次接触一个应用使用sys_guid()函数生成键值,不过对方使用-分割,36位字符串长度.一个表有6个这样的字段.昏..
--//还真的没有反过来想利用raw类型可以减少磁盘空间占用.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING          VERSION    BANNER                                                                       CON_ID
-------------------- ---------- ----------------------------------------------------------------------------- -----
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production      0

SCOTT@test01p> create table t (id number ,text raw(16));
Table created.

SCOTT@test01p> create index i_t_text on t(text);
Index created.
--//索引可以建立.

2.测试一:
SCOTT@test01p> insert into t values (1,'aa');
1 row created.

SCOTT@test01p> insert into t values (2,'AA');
1 row created.

SCOTT@test01p> commit;
Commit complete.

SCOTT@test01p> select * from t;
ID TEXT
--- -----
  1 AA
  2 AA

SCOTT@test01p> select dump(text)  c20 ,dump(text,16) c30 from t;
C20               C30
----------------- ----------------
Typ=23 Len=1: 170 Typ=23 Len=1: aa
Typ=23 Len=1: 170 Typ=23 Len=1: aa

--//不管大小写实际上保存的都是大写AA.一样的东西. 可以发现长度占1个字符.

3.测试二:
SCOTT@test01p> insert into t values (3,'ZZ');
insert into t values (3,'ZZ')
                        *
ERROR at line 1:
ORA-01465: invalid hex number

--//仅仅支持0-9,A-F等16进制的字符.其他英文字符不行.

4.测试三:

SCOTT@test01p> update t set text='41' where id=2;
1 row updated.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select * from t where text='AA';
        ID TEXT
---------- ----------------------------------------
         1 AA

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  a4pp1xwt277wq, child number 0
-------------------------------------
select * from t where text='AA'
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| T    |      1 |    23 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(RAWTOHEX("TEXT")='AA')

--//查询注意条件,要注意隐式转换.使用hextoraw函数.

SCOTT@test01p> select * from t where text=hextoraw('AA');
        ID TEXT
---------- -----
         1 AA

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  0vqkyw1y8mu1s, child number 0
-------------------------------------
select * from t where text=hextoraw('AA')
Plan hash value: 108023753
-------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name     | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |          |        |       |     1 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T        |      1 |    23 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | I_T_TEXT |      1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
   2 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("TEXT"=HEXTORAW('AA'))

--//这样给开发提出一些特殊要求.

5.看看块内保存信息.

SCOTT@test01p> insert into t values (3,sys_guid());
1 row created.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select rowid , t.* from t;
ROWID               ID TEXT
------------------ --- --------------------------------
AAAaIuAAJAAACSFAAA   3 506C93AB29AF454AA8967ACBF651E8A5
AAAaIuAAJAAACSFAAB   1 AA
AAAaIuAAJAAACSFAAC   2 41

SCOTT@test01p> @ rowid AAAaIuAAJAAACSFAAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA   DBA    TEXT
---------- ---------- ---------- ---------- ----------- ------ ----------------------------------------
    107054          9       9349          0  0x2402485  9,9349 alter system dump datafile 9 block 9349

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

--//查看转储信息:
Block header dump:  0x02402485
Object id on Block? Y
seg/obj: 0x1a22e  csc: 0x00.1953fb3  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2402480 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0004.010.0000607a  0x0140138f.065f.11  --U-    1  fsc 0x0000.01954151
0x02   0x000b.018.000012de  0x014001ba.040c.1a  --U-    1  fsc 0x0000.01953fb5
bdba: 0x02402485
data_block_dump,data header at 0x1ee5064
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x01ee5064
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f5a
avsp=0x1f57
tosp=0x1f57
0xe:pti[0]    nrow=3    offs=0
0x12:pri[0]    offs=0x1f5a
0x14:pri[1]    offs=0x1f79
0x16:pri[2]    offs=0x1f71
block_row_dump:
tab 0, row 0, @0x1f5a
tl: 23 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 04
col  1: [16]  50 6c 93 ab 29 af 45 4a a8 96 7a cb f6 51 e8 a5
tab 0, row 1, @0x1f79
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  1: [ 1]  aa
tab 0, row 2, @0x1f71
tl: 8 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  41
end_of_block_dump
End dump data blocks tsn: 3 file#: 9 minblk 9349 maxblk 9349

总结:
1.占用空间减少1半.
2.输入类型存在限制,仅仅16进制字符,大小写不区分.
3.注意类型转换问题,要使用hextoraw函数.

时间: 2024-10-17 23:51:37

[20171203]关于raw类型.txt的相关文章

[20150503]关于oracle的number类型.txt

[20150503]关于oracle的number类型.txt --节前的事情,别人建表使用number类型,本来想定义成number(10,2),结果少输入0,变成number(1,2). --在我的记忆里,好像前面的数值应该大于后面的精度的,没想到这样竟然可以通过,自己感到很奇怪! --测试下来,才知道自己oracle基本的东西都不是很清楚. 1.首先提到我以前写的一篇blog: [20140823]在sqlplus使用copy注意.txt http://blog.itpub.net/267

[20160828]number类型.txt

[20160828]number类型.txt --昨天看了一个链接http://www.cnblogs.com/kerrycode/p/4427352.html,感觉有点不对,上班测试看看. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------

[20161123]oracle数据块类型.txt

[20161123]oracle数据块类型.txt --oracle 数据块有许多类型,自己平时很少关注与记忆,自己做一个归纳总结: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------

[20151119]nvarchar2类型.txt

[20151119]nvarchar2类型.txt -- 前几天帮别人看awr报表,连接如下:http://www.itpub.net/thread-1942785-1-1.html -- 最终确定是使用navrchar2存在隐式转换,实际上如果应用没有国际化需求,不要使用这个类型,通过一些例子来说明问题. 1.环境: SCOTT@book> create table t ( id number,c1 varchar2(20),c2 nvarchar2(20)); Table created.

U盘为Raw类型的解决技巧

  问题描述: u盘提示格式化,不敢格式化.格式化后提示,提示无法格式化. 首先,我们得明确一条这样的U盘是可救的,u盘里的内容也是可恢复的. 操作步骤: 1.恢复数据 插入U盘.使用一个叫做易我数据恢复的神器.国产且免费.并且仅限大陆使用. 点击分区恢复,然后选择你要恢复的U盘.之后下一步就是了,根据提示,一直走就是,最后会重建目录,然后你选择你要恢复的文件就可以了.支持预览.不多废话了.等待恢复完成后,进入下一步. 2.恢复优盘 首先下载一个叫做USBBoot的软件,或者是DiskGeniu

[20140823]11g增加字段与缺省值.txt

[20140823]11g增加字段与缺省值.txt --12c 当插入NULL时可以指定缺省值.不知道为什么设置这个特性,有点怪怪的.自己先测试11G增加字段带缺省值的情况. --11G 增加字段带缺省值,可以很快完成,不需要update表.简单测试其内部机制: 1.建立测试环境: SCOTT@test01p> @ver BANNER                                                                               CON

C#下的Raw Socket编程实现网络封包监视

编程|网络 谈起socket编程,大家也许会想起QQ和IE,没错.还有许多网络工具如P2P.NetMeeting等在应用层实现的应用程序,也是用socket来实现的.Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点.Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中.Socket规范2.2版(其在Windows平台上的版本是Winsock2

用C#下的Raw Socket编程实现网络封包监视

编程|网络 谈起socket编程,大家也许会想起QQ和IE,没错.还有许多网络工具如P2P.NetMeeting等在应用层实现的应用程序,也是用socket来实现的.Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点.Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中.Socket规范2.2版(其在Windows平台上的版本是Winsock2

用C#的Raw Socket实现网络封包监视

网络 谈起socket编程,大家也许会想起QQ和IE,没错.还有许多网络工具如P2P.NetMeeting等在应用层实现的应用程序,也是用socket来实现的.Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点.Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中.Socket规范2.2版(其在Windows平台上的版本是Winsock2.2,