查看: 3262|回复: 13

sql优化问题,谢谢

[复制链接]
论坛徽章:
3
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:51:22
发表于 2009-8-31 11:50 | 显示全部楼层 |阅读模式
select * FROM TS_TRANSIT_H where TS_TRANSIT_H.RECEIVE_DT IS NULL;

RECEIVE_DT这里有索引,但用不到.IS NULL条件的条数很少,表数据量多.

象 IS NULL这样的sql如何调整.

谢谢

论坛徽章:
3
九尾狐狸
日期:2006-04-12 17:47:49ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2009-8-31 12:03 | 显示全部楼层
什么类型的列? 可以考虑创建一个基于函数的索引。

使用道具 举报

回复
论坛徽章:
0
发表于 2009-8-31 12:18 | 显示全部楼层
对不起,null值是用不上索引的

使用道具 举报

回复
论坛徽章:
3
九尾狐狸
日期:2006-04-12 17:47:49ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2009-8-31 12:50 | 显示全部楼层
没错,对于空列当然不能走索引,但可以对创建基于Decode的函数的索引,然后对sql稍作修改,测试如下:

kl@k01>create table te1234 as select object_id a,object_id b from dba_objects;

Table created.

kl@k01>update te1234 set a = null where a like '%110%';

212 rows updated.

kl@k01>commit;

Commit complete.

kl@k01>exec dbms_stats.gather_table_stats(user,'te1234',cascade=>true)

PL/SQL procedure successfully completed.

kl@k01>create index te1234_idx1 on te1234(a);

Index created.

kl@k01>create index te1234_idx2 on te1234(b);

Index created.

kl@k01>create index te1234_idxfb on te1234(decode(a,null,99999999,a));

Index created.

kl@k01>exec dbms_stats.gather_table_stats(user,'te1234',cascade=>true);

PL/SQL procedure successfully completed.


kl@k01>select * from te1234 where decode(a,null,99999999,a)=99999999;

Execution Plan
----------------------------------------------------------
Plan hash value: 2481954678

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |   212 |  2120 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TE1234       |   212 |  2120 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TE1234_IDXFB |   212 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

使用道具 举报

回复
认证徽章
论坛徽章:
89
生肖徽章2007版:鼠
日期:2009-03-10 21:19:05生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2009-10-14 09:31:39生肖徽章2007版:龙
日期:2009-03-10 21:14:14生肖徽章2007版:蛇
日期:2009-03-16 10:41:01生肖徽章2007版:马
日期:2009-10-21 16:45:13生肖徽章2007版:羊
日期:2009-03-24 07:32:42生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53
发表于 2009-8-31 13:25 | 显示全部楼层
楼上建议不错

[ 本帖最后由 nw5452 于 2009-8-31 13:38 编辑 ]

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-8-31 13:42 | 显示全部楼层
原帖由 fangxinba 于 2009-8-31 11:50 发表
select * FROM TS_TRANSIT_H where TS_TRANSIT_H.RECEIVE_DT IS NULL;

RECEIVE_DT这里有索引,但用不到.IS NULL条件的条数很少,表数据量多.

象 IS NULL这样的sql如何调整.

谢谢



建个索引,索引字段为:(RECEIVE_DT,'1');

使用道具 举报

回复
论坛徽章:
3
九尾狐狸
日期:2006-04-12 17:47:49ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2009-8-31 13:47 | 显示全部楼层
这是最优方法

kl@k01>create index te_ind3c on te1234(a,1);

Index created.

kl@k01>set autotrace traceonly exp stat;
kl@k01>set autotrace traceonly exp;
kl@k01>select * from te1234 where a is null;

Execution Plan
----------------------------------------------------------
Plan hash value: 3547170523

----------------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |   212 |  2120 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TE1234   |   212 |  2120 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TE_IND3C |   212 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

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

   2 - access("A" IS NULL)

kl@k01>

使用道具 举报

回复
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
发表于 2009-8-31 13:53 | 显示全部楼层
学习

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-8-31 13:58 | 显示全部楼层

回复 #7 kl911 的帖子

(a,1); 用单引号把1引起来,否,低版本分析该索引时,很容易遇上BUG。

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:跆拳道
日期:2008-08-28 12:23:10奥运会纪念徽章:棒球
日期:2008-09-02 11:35:20
发表于 2009-8-31 14:08 | 显示全部楼层
mark

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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