注册
DM空值与null
培训园地/ 文章详情 /

DM空值与null

z℃ 2023/03/01 1502 0 0

日常工作中,常遇到null和空值相关操作,本篇主要说明二者的关系和区别。

1、测试过程
1、null和空值比较
SQL> select dump(‘a’),dump(‘’),dump(null);

行号 DUMP(‘a’) DUMP(‘’) DUMP(NULL)


1 Typ=2 Len=1: 97 NULL NULL --内部没有存储

SQL> select * from tnull;

行号 COL COL1 COL2 COL3 COL4 COL5


1 aaaaaaaaaa NULL bbbbbbbbbb cccccccccc dddddddddd
2 1111111111 2222222222 3333333333 4444444444 5555555555 6666666666

hexdump /home/dmdba/dmdbms/dmdb/tbs1.dbf

0020050 0034 0000 0000 0000 0000 ffff ffff ffff
0020060 ffff 4400 000c 618a 6161 6161 6161 6161
0020070 8a61 6262 6262 6262 6262 6262 8a80 6363
0020080 6363 6363 6363 6363 648a 6464 6464 6464
0020090 6464 0164 0000 0000 ff00 ffff 7fff ffff
00200a0 877e 0001 0000 5900 0000 318a 3131 3131
00200b0 3131 3131 8a31 3232 3232 3232 3232 3232
00200c0 338a 3333 3333 3333 3333 8a33 3434 3434
00200d0 3434 3434 3434 358a 3535 3535 3535 3535
00200e0 8a35 3636 3636 3636 3636 3636 0002 0000
00200f0 0000 ffff ffff ff7f 7fff 0187 0000 0000
0020100 0000 0000 0000 0000 0000 0000 0000 0000

从二进制可以看出还是有区别的。

SQL> select * from dual where ‘’=null;
未选定行

已用时间: 0.874(毫秒). 执行号:2307.
SQL> select * from dual where ‘’ is null;
未选定行

已用时间: 1.075(毫秒). 执行号:2308.
SQL> select * from dual where ‘’=‘’;

行号 DUMMY


1 X

已用时间: 0.158(毫秒). 执行号:2309.
SQL> select * from dual where null=null;
未选定行

已用时间: 0.174(毫秒). 执行号:2310.
SQL> select * from dual where null is null;

行号 DUMMY


1 X

已用时间: 0.134(毫秒). 执行号:2311.
SQL> select * from dual where null is not null;
未选定行

已用时间: 0.657(毫秒). 执行号:2312.
SQL> select * from dual where ‘’ is not null;

行号 DUMMY


1 X

2、null、空值与索引关系
create table t001(id int,info varchar2(100),info1 clob);
select rownum id,dbms_random.string(‘p’,80),dbms_random.string(‘p’,1000) name from dual connect by rownum<100000;
insert into t001(id,info,info1) values(200000,‘’,‘ddd’);
insert into t001(id,info,info1) values(200001,null,‘eee’);
commit;
SQL> create index idxinfo on t001(info);
操作已执行
已用时间: 416.603(毫秒). 执行号:2382.
SQL> dbms_stats.gather_table_stats(‘SYSDBA’,‘T001’);
DMSQL 过程已成功完成
已用时间: 700.856(毫秒). 执行号:2383.

SQL> explain select * from t001 where info is null;

1 #NSET2: [1, 1, 108]
2 #PRJT2: [1, 1, 108]; exp_num(4), is_atom(FALSE)
3 #BLKUP2: [1, 1, 108]; IDXINFO(T001)
4 #SSEK2: [1, 1, 108]; scan_type(ASC), IDXINFO(T001), scan_range[NULL,NULL]

已用时间: 0.565(毫秒). 执行号:0.
SQL> explain select * from t001 where info=‘’;

1 #NSET2: [1, 1, 108]
2 #PRJT2: [1, 1, 108]; exp_num(4), is_atom(FALSE)
3 #BLKUP2: [1, 1, 108]; IDXINFO(T001)
4 #SSEK2: [1, 1, 108]; scan_type(ASC), IDXINFO(T001), scan_range[‘’,‘’]

已用时间: 0.617(毫秒). 执行号:0.
说明:索引中存储了null和空值,否则不能走索引扫描

3、相关参数
STR_NULL_OPS_COMPATIBLE:null与其他字符串相加时,是否返回null(默认null)
ORDER_BY_NULLS_FLAG:控制排序时NULL值返回的位置

4、总结
null的比较必须通过is、is not比较,否则使用其他方式返回值为null
null与空完全不同,通过dump查看,未被存储,而二进制文件还是有区分
空与空比较使用通用的比较符
DM的二级索引中存储了索引列为null和空的值

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服