关于NULL

简介: 今天在优化sql语句的时候发现存在如下sql语句,像这样 select * from t where object_name='' ; 发现执行计划里面存在全表扫描,这个问题主要在与开发人员没有判断输入的条件。

今天在优化sql语句的时候发现存在如下sql语句,像这样
select * from t where object_name='' ;

发现执行计划里面存在全表扫描,这个问题主要在与开发人员没有判断输入的条件。

自己写了一个测试例子,如下:


1。建立表以及索引:
create table t as select * from all_objects ;

create index i_t_object_name on t(object_name);

2。分析表
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS (
OwnName => 'SCOTT'
,TabName => 'T'
,Cascade => TRUE);
END;

3.测试:
set autotrace traceonly
select * from t where object_name='' ;

no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 1322348184

---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| T | 44358 | 5544K| 149 (3)| 00:00:02 |
---------------------------------------------------------------------------

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

1 - filter(NULL IS NOT NULL)

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
913 bytes sent via SQL*Net to client
323 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed


开始对consistent gets为0很不理解,实际上在filter上已经说明条件是NULL IS NOT NULL,
这个条件永远为假。可以这个看在输入这个条件object_name=''时,oracle将''看成NULL,
如果输入如下条件object_name=NULL或者NULL=NULL,结果也是一样的,这个也可以说明
oracle中NULL不等于NULL。要真正查找NULL要写成 select * from t where object_name
is NULL ;

在来看这个执行结果,先修改表t的object_name字段让它不为NULL(实际上建立T表时已经定义):
ALTER TABLE T MODIFY(object_name NOT NULL);

select * from t where object_name is NULL ;

执行计划的filter还是,1 - filter(NULL IS NOT NULL)。

如果修改字段属性object_name为NULL
ALTER TABLE T MODIFY(object_name NULL);

执行计划的变为1 - filter("OBJECT_NAME" IS NULL)。

目录
相关文章
|
6月前
|
计算机视觉
detectMultiScale
【6月更文挑战第8天】
265 4
|
开发工具 Python
ignatureNonceIsNull
ignatureNonceIsNull
75 1
|
SQL 数据库
浅谈null
前言: 我们平时对SQL的数值处理的过程中,经常会纠结一个问题,要不要设置为null?那么null到底是什么意思?在这篇文章中,我将为大家简单的介绍一下我们使用的null。
5898 0
浅谈null
The Sandwich Rule
目标:训练一个可以直接以任意宽度运行的单一网络。其实是在权重共享的条件下,我们可以根据不同的硬件设备挑选不同宽度的网络,不再重训练一个权重。
122 0
The Sandwich Rule
|
Serverless 程序员 云计算
Serverful
Serverful
179 0
Helpful Maths
Helpful Maths
139 0
Helpful Maths
|
人工智能
Colorful Slimes
题目描述 Snuke lives in another world, where slimes are real creatures and kept by some people. Slimes come in N colors. Those colors are conveniently numbered 1 through N. Snuke currently has no slime. His objective is to have slimes of all the colors together.
97 0
|
Web App开发 前端开发 JavaScript
gulp
gulp 1. 安装 npm install --g gulp 2. 初始化 npm init 3.
1091 0
|
JavaScript 前端开发