查看: 8233|回复: 17

[性能调整] 【讨论】B_tree索引null值不入索引执行计划问题

[复制链接]
认证徽章
论坛徽章:
9
优秀写手
日期:2014-01-08 06:00:12目光如炬
日期:2014-02-17 06:00:122014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09目光如炬
日期:2014-03-03 06:00:12目光如炬
日期:2014-04-21 06:00:12技术图书徽章
日期:2014-06-20 16:24:20暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-5-14 11:47 | 显示全部楼层 |阅读模式
大家早上好哈!咨询个小问题:
对于单键值的B树索引而言,null值不入索引,如果创建该索引的列没有设置not null,即使表中没有索引字段为null的纪录,oracle出于安全考虑,也不会走索引,我试验结果是这样的,请问是这样的吗?谢谢
认证徽章
论坛徽章:
9
优秀写手
日期:2014-01-08 06:00:12目光如炬
日期:2014-02-17 06:00:122014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09目光如炬
日期:2014-03-03 06:00:12目光如炬
日期:2014-04-21 06:00:12技术图书徽章
日期:2014-06-20 16:24:20暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-5-14 11:47 | 显示全部楼层
希望各位大虾多多指点哈,谢谢

使用道具 举报

回复
认证徽章
论坛徽章:
9
优秀写手
日期:2014-01-08 06:00:12目光如炬
日期:2014-02-17 06:00:122014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09目光如炬
日期:2014-03-03 06:00:12目光如炬
日期:2014-04-21 06:00:12技术图书徽章
日期:2014-06-20 16:24:20暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-5-14 11:48 | 显示全部楼层
希望各位大虾多多指点哈,谢谢

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6348
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:252012新春纪念徽章
日期:2014-12-29 12:11:142013年新春福章
日期:2014-12-29 12:11:14马上有车
日期:2014-12-29 12:11:14马上有房
日期:2014-12-29 12:11:14马上有钱
日期:2014-12-29 12:11:14马上有对象
日期:2014-12-29 12:11:14马上加薪
日期:2014-12-29 12:11:14
发表于 2014-5-14 12:06 | 显示全部楼层
对,你说的

使用道具 举报

回复
认证徽章
论坛徽章:
1
生肖徽章2007版:蛇
日期:2008-12-03 20:20:30
发表于 2014-5-14 13:02 | 显示全部楼层
肯定不是这样的,不然oracle太傻了吧。

使用道具 举报

回复
认证徽章
论坛徽章:
1
生肖徽章2007版:蛇
日期:2008-12-03 20:20:30
发表于 2014-5-14 13:05 | 显示全部楼层
sivxy 发表于 2014-5-14 13:02
肯定不是这样的,不然oracle太傻了吧。

SQL> create table t2 (id number);

Table created

SQL> insert into t2 select rownum from dual connect by rownum<100000;

99999 rows inserted

SQL> commit;

Commit complete

SQL> create index idx_t2 on t2(id) tablespace foridx;

Index created

SQL>  set autotrace traceonly explain;
SQL> select id from t2 where id=1234;  

Execution Plan
----------------------------------------------------------
Plan hash value: 3806787055

---------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |     1 |    13 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_T2 |     1 |    13 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

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

   1 - access("ID"=1234)

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

SQL>

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2014-5-14 13:19 | 显示全部楼层
不是出于“安全考虑”,是出于保证结果正确性的目的,如果走索引,不能保证结果正确,就不会走。
比如 select count(*) from t1这种语句,由于索引中不存储空值,就意味着如果某行记录中的该索引列的取值为空的话,就不会出现在该索引中。那么如果通过统计索引中记录数的方法来计算表中的行数,显然是有可能不正确的。
但如果我在该列上设置了NOT NULL,则可以确保表中的每一行,都出现在了索引中。那么,我通过统计索引中的记录数,就可以得到表的总行数。这时,再执行这个语句,执行计划就极有可能选择走索引,而不是全表扫描了。

使用道具 举报

回复
论坛徽章:
737
发表于 2014-5-14 13:20 | 显示全部楼层
sivxy 发表于 2014-5-14 13:05
SQL> create table t2 (id number);

Table created

nice job

使用道具 举报

回复
论坛徽章:
737
发表于 2014-5-14 13:20 | 显示全部楼层
lz这个结论过于绝对。。。。

使用道具 举报

回复
认证徽章
论坛徽章:
9
优秀写手
日期:2014-01-08 06:00:12目光如炬
日期:2014-02-17 06:00:122014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09目光如炬
日期:2014-03-03 06:00:12目光如炬
日期:2014-04-21 06:00:12技术图书徽章
日期:2014-06-20 16:24:20暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-5-14 13:41 | 显示全部楼层
是的,因为Oracle无论如何也要保证查询结果的正确性--崔华

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表