查看: 4052|回复: 12

关于表和索引的SQL优化

[复制链接]
论坛徽章:
18
CTO参与奖
日期:2009-01-15 11:42:46奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-22 14:39:55灰彻蛋
日期:2012-05-15 14:37:582011新春纪念徽章
日期:2011-02-18 11:43:32生肖徽章2007版:兔
日期:2011-01-20 12:58:492011新春纪念徽章
日期:2011-01-04 10:35:48数据库板块每日发贴之星
日期:2010-12-09 01:01:012010广州亚运会纪念徽章:帆船
日期:2010-12-06 11:01:472010广州亚运会纪念徽章:曲棍球
日期:2010-12-06 10:59:28
发表于 2009-12-24 10:23 | 显示全部楼层 |阅读模式
下面的一下SQL,在infobase上classid上建有索引
执行时要花18秒的时间(查看执行计划进行了全表扫描),但是如果去掉SQL中标红的两个classid值,执行时才用掉0.125秒(查看执行计划用了classid索引扫描);
这是什么原因,是不是infobase表存在碎片,如何对表再进行优化?

select classid,
       title,
       introduce,
       content,
       contenttype,
       contentsize,
       attachmentcount,
       subject,
       keywords,
       relateinfo,
       createtime,
       lastaccesstime,
       originaltime,
       modifytime,
       expiretime,
       poster,
       author,
       posterid,
       source,
       infolevel,
       importance,
       urgency,
       infovalue,
       accesstimes,
       ratetimes,
       sumrate,
       follownumber,
       parentid,
       rootid,
       status,
       acl,
       inheritable,
       reservedint1,
       reservedint2,
       reservedint3,
       reservedchar1,
       reservedchar2,
       reservedchar3,
       id,
       category,
       rownum
  from (select *
          from infobase
         where status = 0
              --and (classid in ('(000100010003000700060001)'))
           and classid in ('(00010001000400150007)', '(00010001000400160007)',
                '(00010001000400170007)', '(00010001000400180007)',
                '(00010001000400190007)', '(00010001000400200007)',
                '(00010001000400210007)', '(00010001000400220007)',
                '(00010001000400230007)', '(00010001000400240007)',
                '(00010001000400250007)', '(00010001000400260007)',
                '(00010001000400270007)', '(00010001000400280007)',
                '(00010001000400290007)', '(00010001000400310007)',
                '(00010001000400320007)', '(00010001000400330007)',
                '(00010001000400340007)', '(00010001000400350007)',
                '(00010001000400360007)', '(00010001000400370007)',
                '(00010001000400380007)', '(00010001000400390007)',
                '(00010001000400400007)', '(00010001000400410007)',
                '(00010001000400430007)', '(00010001000400440007)',
                '(00010001000400450007)', '(00010001000400460007)',
                '(00010001000400470007)', '(00010001000400510007)',
                '(00010001000400530007)')
              
           and originaltime >=
               to_date('1970-1-1 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
           and originaltime <=
               to_date('2049-1-1 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
         order by originaltime desc)
where rownum <= 10
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:08:28
发表于 2009-12-24 10:36 | 显示全部楼层
表分析下

使用道具 举报

回复
论坛徽章:
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-12-24 10:40 | 显示全部楼层
select count(*) from infobase
where classid in ('(00010001000400470007)', '(00010001000400510007)')

?

使用道具 举报

回复
论坛徽章:
18
CTO参与奖
日期:2009-01-15 11:42:46奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-22 14:39:55灰彻蛋
日期:2012-05-15 14:37:582011新春纪念徽章
日期:2011-02-18 11:43:32生肖徽章2007版:兔
日期:2011-01-20 12:58:492011新春纪念徽章
日期:2011-01-04 10:35:48数据库板块每日发贴之星
日期:2010-12-09 01:01:012010广州亚运会纪念徽章:帆船
日期:2010-12-06 11:01:472010广州亚运会纪念徽章:曲棍球
日期:2010-12-06 10:59:28
 楼主| 发表于 2009-12-24 11:42 | 显示全部楼层
原帖由 ZALBB 于 2009-12-24 10:40 发表
select count(*) from infobase
where classid in ('(00010001000400470007)', '(00010001000400510007)')

?

单独执行你这个语句也很快,
现在发现是:如果去任意的两个classid的值,执行结果都会很快,这很奇怪

使用道具 举报

回复
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-12-24 11:54 | 显示全部楼层
给出执行计划~

inlist的长度可能导致执行计划的改变
估计是INLIST ITERATOR-->CONCATENATION

使用道具 举报

回复
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
发表于 2009-12-24 12:11 | 显示全部楼层
是否data skew,因为红色那两个classid会返回很多行并且你收集了柱状图?

大不了加个hint写死。

使用道具 举报

回复
论坛徽章:
18
CTO参与奖
日期:2009-01-15 11:42:46奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-22 14:39:55灰彻蛋
日期:2012-05-15 14:37:582011新春纪念徽章
日期:2011-02-18 11:43:32生肖徽章2007版:兔
日期:2011-01-20 12:58:492011新春纪念徽章
日期:2011-01-04 10:35:48数据库板块每日发贴之星
日期:2010-12-09 01:01:012010广州亚运会纪念徽章:帆船
日期:2010-12-06 11:01:472010广州亚运会纪念徽章:曲棍球
日期:2010-12-06 10:59:28
 楼主| 发表于 2009-12-24 12:43 | 显示全部楼层
原帖由 viadeazhu 于 2009-12-24 12:11 发表
是否data skew,因为红色那两个classid会返回很多行并且你收集了柱状图?

大不了加个hint写死。

sql是写在组件里的,是开发人员写的,不能更改了

使用道具 举报

回复
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
发表于 2009-12-24 12:49 | 显示全部楼层
原帖由 lichangzai 于 2009-12-24 12:43 发表

sql是写在组件里的,是开发人员写的,不能更改了

用的是CBO吧~
你可以对比加或者不加hint的执行计划,看看CBO是否认为FTS的cost更低。

optimizer_mode是什么?
表的统计信息是否最新?
是否有柱状图?
。。。

一堆东西都会影响你的执行计划,如果你都不懂,那么也可以发上来个10053看看。

使用道具 举报

回复
论坛徽章:
0
发表于 2012-3-6 13:24 | 显示全部楼层
还你好的

使用道具 举报

回复
论坛徽章:
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
发表于 2012-3-6 13:42 | 显示全部楼层

加上两个条件后,返回行多了多少,占多少百分比
看执行计划中的rows列,看看是否能准确的描述结果集
估计是统计数据的问题

使用道具 举报

回复

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

本版积分规则 发表回复

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号
  
快速回复 返回顶部 返回列表