[20160619]NULL在数据库的存储.txt

简介: [20160619]NULL在数据库的存储.txt --简单探究NULL在数据库的存储.这也是别人前几天问的问题,我自己学习oracle这么久,也没有仔细观察过. 1.

[20160619]NULL在数据库的存储.txt

--简单探究NULL在数据库的存储.这也是别人前几天问的问题,我自己学习oracle这么久,也没有仔细观察过.

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

create table t (a number,b number , c number , d number );
insert into t values (1,NULL,NULL,NULL);
insert into t values (2,NULL,2,2);
commit ;
alter system checkpoint ;

2.测试:

SCOTT@test01p> select rowid,t.* from t;
ROWID                       A          B          C          D
------------------ ---------- ---------- ---------- ----------
AAAZpSAAJAAAACNAAA          1
AAAZpSAAJAAAACNAAB          2                     2          2

SCOTT@test01p> @ rowid AAAZpSAAJAAAACNAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    105042          9        141          0 9,141                alter system dump datafile 9 block 141 ;

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

data_block_dump,data header at 0xa7e8264
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x0a7e8264
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f85
avsp=0x1f6c
tosp=0x1f6c
0xe:pti[0]    nrow=2    offs=0
0x12:pri[0]    offs=0x1f92
0x14:pri[1]    offs=0x1f85
block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f85
tl: 13 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: *NULL*
col  2: [ 2]  c1 03
col  3: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 3 file#: 9 minblk 141 maxblk 141

--从转储可以发现如果插入NULL在后面的字段,oracle是不保存的.可以发现col  1: *NULL* ,但是具体数值是多少呢?从这里看不出来.
--最简单的方法是通过bbed观察:

BBED> set dba 9,142
        DBA             0x0240008e (37748878 9,142)

--注:我在windows下使用bbed存在1个数据块的偏移.
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @8169     0x2c

BBED> x /r
rowdata[0]                                  @8169
----------
flag@8169: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8170: 0x01
cols@8171:    4

col    0[2] @8172:  0xc1  0x03
col    1[0] @8175: *NULL*
col    2[2] @8176:  0xc1  0x03
col    3[2] @8179:  0xc1  0x03

--可以col    1[0] @8175: *NULL*,里面的长度是0,也就是NULL不占用空间,但是长度指示器保存的是0.但是如果使用dump观察:

BBED> set count 32
        COUNT           32

BBED> dump /v
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\SAMPLE_SCHEMA_USERS01.DBF (9)
Block: 142                                            Offsets: 8169 to 8191     Dba:0x0240008e
------------------------------------------------------------------------------------------------------
2c010402 c103ff02 c10302c1 032c0101 02c10201 06b8b0                             l ,...?..?.?,...?..赴
              ~~   
<48 bytes per line>
--注意看~部分.

BBED> set count 1
        COUNT           1

BBED> dump /v offset 8175
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\SAMPLE_SCHEMA_USERS01.DBF (9)
Block: 142                                           Offsets: 8175 to 8175      Dba:0x0240008e
-----------------------------------------------------------------------------------------------------
ff                                                                              l .
<48 bytes per line>

--可以发现实际上NULL在oracle数据库使用0xff表示.没有长度指示器.
--也就是在rowdata中长度指示器等于0xff,就表示长度=0,内容是NULL.

--也可以参考我以前写的blog,链接如下:

[20121026]varchar2(4000)如何保存.txt http://blog.itpub.net/267265/viewspace-747304/
1.如果列值长度小于等于250字节,Oracle使用1字节存储其列长.内容为字段的长度.
2.如果列值长度超过250字节,则使用3字节存储其列长。前面1个字节使用0xfe(表示超过250),后面2个字节表示列值长度.

[20140512]关于降序索引.txt          http://blog.itpub.net/267265/viewspace-1159181/

目录
相关文章
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
768 0
|
8月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
9月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
11月前
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
410 12
|
12月前
|
存储 SQL NoSQL
【赵渝强老师】达梦数据库的逻辑存储结构
本文介绍了达梦数据库的存储结构,包括逻辑和物理存储两部分。逻辑存储结构由数据库(Database)、表空间(Tablespaces)、段(Segments)、簇(Cluster)和页(Page)组成。数据库是最大逻辑单元,包含所有表、索引等;表空间由数据文件组成,用于存储对象;段由簇构成,簇包含连续的数据页;页是最小存储单元。文中还提供了查询表空间、段和页大小的SQL语句,并附有视频讲解和示意图。
443 7
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课3 共享存储在线扩容
本文继续探讨穷鬼玩PolarDB RAC一写多读集群系列,介绍如何在线扩容共享存储。实验环境依赖《在Docker容器中用loop设备模拟共享存储》搭建。主要步骤包括:1) 扩容虚拟磁盘;2) 刷新loop设备容量;3) 使用PFS工具进行文件系统扩容;4) 更新数据库实例以识别新空间。通过这些步骤,成功将共享存储从20GB扩容至30GB,并确保所有节点都能使用新的存储空间。
266 1
|
12月前
|
存储 SQL 安全
【赵渝强老师】达梦数据库的物理存储结构
本文介绍了达梦数据库的存储结构及各类物理文件的作用。达梦数据库通过逻辑和物理存储结构管理数据,包含配置文件(如dm.ini、sqllog.ini)、控制文件(dm.ctl)、数据文件(*.dbf)、重做日志文件(*.log)、归档日志文件、备份文件(*.bak)等。配置文件用于功能设置,控制文件记录数据库初始信息,数据文件存储实际数据,重做日志用于故障恢复,归档日志增强数据安全性,备份文件保障数据完整性,跟踪与事件日志辅助问题分析。这些文件共同确保数据库高效、稳定运行。
525 0
|
存储 人工智能 监控
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
244 0
|
存储 druid 分布式数据库
列式存储数据库与超市的关系?
列式存储数据库是一种高效的数据管理方式,类似于超市将相似商品集中摆放。它将相同类型的数据(如年龄、价格)归类存储,便于快速查询和压缩,广泛应用于市场分析、财务报告和健康数据分析等领域。知名产品包括HBase、ClickHouse、Druid和Apache Cassandra等,适合处理大规模数据和实时分析任务。
211 4
|
存储 数据库
快速搭建南大通用GBase 8s数据库SSC共享存储集群
本文介绍如何GBase8s 数据库 在单机环境中快速部署SSC共享存储集群,涵盖准备工作、安装数据库、创建环境变量文件、准备数据存储目录、修改sqlhost、设置onconfig、搭建sds集群及集群检查等步骤,助你轻松完成集群功能验证。

热门文章

最新文章