[20170703]11g增加字段与查询条件的变化

[20170703]11g增加字段与查询条件的变化.txt

--//前几天给别人介绍12c新特性遇到一些问题,一直没空测试看看.有空测试看看.
--//办公环境没有12c,使用11g应该也能说明问题.

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.建立测试环境:
create table t (a number);
insert into t select rownum from dual connect by rownum <=10;
commit;

alter table t add ( b number default 1 not null);
--//注:11g,12c下这样也不会修改表对应的数据块.但是如果在11g这样执行会修改数据块alter table t add ( b number default 1 );
--//这样数据块中没有该字段的记录信息,而实际上查询是有值的,等于1.

--//另外12c下执行alter table t add ( b number );不会修改数据块,参考链接http://blog.itpub.net/267265/viewspace-1335561/
--//应该算12c的新特性.
--//当时的总结如下:
--//增加字段带缺省值,在12c下很快完成,不需修改表,但是以后的插入要多付出2个字节的代价.
--//它通过增加1个隐含字段里面的bit来表示这些字段从那里来读取.
--//后续的插入即使insert不带这些字段,其缺省值也插入数据块中.

insert into t select rownum+10,0  from dual connect by rownum <=1e5-10;
commit ;

--//分析表,并且在b字段建立直方图.
execute sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 for columns b size 254 ',Cascade => True ,No_Invalidate => false)
PL/SQL procedure successfully completed.

SCOTT@book> @desc t
Name  Null?    Type
----- -------- --------
A              NUMBER
B     NOT NULL NUMBER

3.测试:
select * from t where b=1;

SCOTT@book> @ &r/dpc '' projection
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  2gcu8c0ucsuts, child number 0
-------------------------------------
select * from t where b=1
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |    69 (100)|          |
|*  1 |  TABLE ACCESS FULL| T    |     10 |    70 |    69   (2)| 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(NVL("B",1)=1)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
   1 - "T"."A"[NUMBER,22], NVL("B",1)[22]

--//注意看过滤条件,可以发现过滤条件filter(NVL("B",1)=1).而12c增加的条件更加复杂.参考链接
--//http://blog.itpub.net/267265/viewspace-1335561/.

4.如果我给b增加索引,是否可以利用索引吗?这个是我当时的疑问.

SCOTT@book> create index i_t_b on t(b);
Index created.

select * from t where b=1;

--//检查执行计划:
SCOTT@book> @ &r/dpc '' projection
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  2gcu8c0ucsuts, child number 0
-------------------------------------
select * from t where b=1
Plan hash value: 825900994
--------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |        |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| T     |     10 |    70 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_T_B |     10 |       |     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(NVL("B",1)=1)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
   1 - "T"."A"[NUMBER,22], NVL("B",1)[22]
   2 - "T".ROWID[ROWID,10], NVL("B",1)[22]

--//看来是我多虑了,oracle会使用索引.注意看Column Projection Information (identified by operation id):内容.

时间: 2024-09-21 02:45:35

[20170703]11g增加字段与查询条件的变化的相关文章

mongodb的java开发中使用两个字段相等查询条件应该怎么写?

问题描述 mongodb的java开发中使用两个字段相等查询条件应该怎么写? 也就是类似sql中的where 字段A=字段B这样的条件,我查了下网上有些帖子中写的用$where的方式我查询的时候会出错,类似于:new Document("$where",new Document("字段A", "字段B")),驱动版本是3.0 在网上查到一个帖子:http://cache.baiducontent.com/c?m=9d78d513d99c1cf30

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

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

c/c++-使用 mysql c api 中,预处理查询条件 当过滤字段是字符串时

问题描述 使用 mysql c api 中,预处理查询条件 当过滤字段是字符串时 #include <stdio.h> #include <mysql/mysql.h> #include <string.h> int main(void) { // declares MYSQL * connection = NULL; MYSQL_STMT * stmt = NULL; MYSQL_BIND bind[3]; MYSQL_BIND inbind; // preproce

redicate-用Specification组装查询条件时,如何添加两个字段比较或加减运算的查询条件?

问题描述 用Specification组装查询条件时,如何添加两个字段比较或加减运算的查询条件? 我们知道添加下面这样查询条件很容易,只是比较一个字段的: Predicate p = builder.equal(root.get("age"), 30); 如果 需要添加的条件是,假如表是t,字段aaa 是总月数,字段bbb是已过去的月数 我们要查询 剩余月数是3的记录,如何添加 t.aaa-t.bbb = 3 这样的查询条件? 或者添加 t.aaa > t.bbb 这样的条件?

ThinkPHP v3.1开发框架新特性:查询条件预处理

3.0版本对数组方式的查询条件会进行安全过滤(由于3.0强制使用了字段类型检测,所以数组方式的查询条件会强制转换为字段的设定类型),但不支持字符串条件的安全过滤.3.1版本则增加了对条件字符串增加了预处理支持,让ORM的安全性更加得以保证.一.使用where方法 Model类的where方法支持字符串条件预处理,使用方式: $Model->where("id=%d&http://www.aliyun.com/zixun/aggregation/37954.html">

android splite查询条件

问题描述 android splite查询条件 我建了一个表,主键是系统的那个_id自动增加,还有两个数据id和style,其实我是想把id设为主键但网上都说用系统的好我就这么建的.问题是我要用id查询数据但是数据查询不出来,用__id当查询条件就能查出来.请问怎么用id查,把它设为唯一键可以吗 解决方案 _id字段设置成主键后自增,系统默认处理的. 如果用自己id做主键,可以id INTEGER PRIMARY KEY AUTOINCREMENT,这等价于_id INTEGER PRIMARY

ThinkPHP3.1新特性之查询条件预处理简介_php实例

以往的ThinkPHP3.0版本对数组方式的查询条件会进行安全过滤(这是由于3.0强制使用了字段类型检测,所以数组方式的查询条件会强制转换为字段的设定类型),但是3.0版本并不支持字符串条件的安全过滤.而ThinkPHP3.1版本则增加了对条件字符串进行预处理的支持,让ORM的安全性更加得以保证. 一.使用where方法 Model类的where方法支持字符串条件预处理,使用方式: $Model->where("id=%d and username='%s' and xx='%f'&quo

ThinkPHP 3.2.2 框架的模型中where查询条件总结

ThinkPHP_3.2.3 框架的Model,结合官方手册及使用经验汇总出其大体用法: 核心转换方法:     $this->parseWhere($where);    $whereStr .= $this->parseThinkWhere($key, $val);    $this->parseWhereItem($this->parseKey($key), $val);     // 内连接.左连接.右连接 UserModel.class.php    // SQL:( S

mongodb插入数据 增加字段问题?

问题描述 例如:先创建一个文档 doc = {'title':'meimei','name':'john'}然后添加到集合 db.c.insert(doc)db.c.find()没问题然后添加一个字段 doc.age = []再db.c.find() 却看不到新增加的字段? 解决方案 1.使用update, 参看官网:http://docs.mongodb.org/manual/reference/method/db.collection.update/#update-parameterupda