楼主: muyu208

帮忙优化下SQL语句.

[复制链接]
论坛徽章:
0
发表于 2011-12-1 21:42 | 显示全部楼层
muyu208 发表于 2011-12-1 18:07
发重复了

你确定你varchar2字段 用 <=  >= 处理以后的结果是你需要的结果吗?

使用道具 举报

回复
论坛徽章:
0
发表于 2011-12-1 21:44 | 显示全部楼层
你用to_number()处理一下,然后建个函数索引就能用到索引啦

使用道具 举报

回复
论坛徽章:
16
2011新春纪念徽章
日期:2011-02-18 11:42:47奥迪
日期:2014-02-19 23:01:52马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02夏利
日期:2014-01-05 23:30:122013年新春福章
日期:2013-02-25 14:51:24咸鸭蛋
日期:2013-01-06 18:38:44复活蛋
日期:2012-12-27 22:39:382012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2011-12-1 21:47 | 显示全部楼层
iori809 发表于 2011-12-1 17:27
我觉得可能是你的数据类型的原因~
varchar类型但是你所做的是number的范围操作~所以没法走索引

应该也是这个原因,oracle数据类型隐轼转换,结果是“在索引列上使用函数不走索引了”
试试 to_char('2005115155515')

使用道具 举报

回复
论坛徽章:
0
发表于 2011-12-1 21:52 | 显示全部楼层
测试了一下,单独建个函数索引也没有问题


create index idx_test on TAB_BILL_PROVIDE(to_number(START_NO),to_number(START_NO));

使用道具 举报

回复
论坛徽章:
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
发表于 2011-12-1 23:21 | 显示全部楼层
1  楼主需要考虑到一点,此执行计划虽慢,但可能是最快的方式。
2  可以考虑作分区。

使用道具 举报

回复
论坛徽章:
39
祖国60周年纪念徽章
日期:2009-10-09 08:28:00马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:362014年世界杯参赛球队: 瑞士
日期:2014-05-20 13:38:33暖羊羊
日期:2015-02-10 17:19:24
发表于 2011-12-2 08:55 | 显示全部楼层
muyu208 发表于 2011-12-1 17:57
可能刚才描述有点问题,重新描述下:
比如说公司开了10000个单号,这些单号不是一次性发放下去的,而是一批一 ...

换一种方法,你可以用 start_no<=:a and start_no>=:a-10000 and end_no>=:a,
这种的话一定走索引,但不知道业务是否正确

使用道具 举报

回复
论坛徽章:
4
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:022011新春纪念徽章
日期:2011-01-12 11:41:59ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512012新春纪念徽章
日期:2012-01-04 11:54:26
 楼主| 发表于 2011-12-2 09:26 | 显示全部楼层
刚才经过测试,建函数索引也是走全表扫描的
另外,大家说字段的类型改成number,不能改,因为start_no或end_no里面可能包括有字符的

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59
发表于 2011-12-2 09:42 | 显示全部楼层
select/*+ rule */ * from TEST.TAB_BILL_PROVIDE where  START_NO<='205013935880' and END_NO>='205013935980';

使用道具 举报

回复
论坛徽章:
1
咸鸭蛋
日期:2013-07-15 23:29:48
发表于 2011-12-2 10:17 | 显示全部楼层
我来学习一下

使用道具 举报

回复
论坛徽章:
19
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292015年新春福章
日期:2015-03-04 14:53:16优秀写手
日期:2014-03-19 06:00:24马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08比亚迪
日期:2013-10-23 21:35:02ITPUB社区12周年站庆徽章
日期:2013-10-08 14:54:39茶鸡蛋
日期:2013-07-25 19:48:40灰彻蛋
日期:2013-05-24 09:42:412013年新春福章
日期:2013-02-25 14:51:24
发表于 2011-12-2 15:15 | 显示全部楼层

优化器没有错

业务设计的问题;很明显(start_no,end_no)索引的选择率是非常低的,查询的条件又不是等值的查询,全表扫描很正常

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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