查看: 2392|回复: 4

请各位看看这个SQL怎么优化

[复制链接]
论坛徽章:
9
生肖徽章2007版:鼠
日期:2009-04-28 12:11:56祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010广州亚运会纪念徽章:自行车
日期:2010-11-17 17:05:31ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51
发表于 2010-5-15 14:18 | 显示全部楼层 |阅读模式
在tb_backorderstatus 表有entertime 及orderid 索引

SQL.txt

3.43 KB, 下载次数: 10

10046.txt

64.55 KB, 下载次数: 7

认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-5-15 14:39 | 显示全部楼层

回复 #1 zwc1083 的帖子

如下两个记录数分别是多少?
select count(*) from tb_backorderstatus;

select count(*) from tb_backorderstatus  where entertime >= To_date('2010-04-21 08:00:00','yyyy-mm-dd hh24:mi:ss') and  entertime <= To_date('2010-05-06 08:00:00','yyyy-mm-dd hh24:mi:ss')

使用道具 举报

回复
论坛徽章:
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
发表于 2010-5-15 15:12 | 显示全部楼层
楼主, 语句实际运行耗时多久? 10046里显示,不到1秒出结果, 这样还需要优化?

使用道具 举报

回复
论坛徽章:
9
生肖徽章2007版:鼠
日期:2009-04-28 12:11:56祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010广州亚运会纪念徽章:自行车
日期:2010-11-17 17:05:31ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51
 楼主| 发表于 2010-5-15 16:19 | 显示全部楼层
全过程 从客服端->应用层(中间层)->db ...->客服端显示数据要50S 要调整是tb_backorderstatus(500W记录) 这个表,因为在时间上做了加减,所以全表scan,
select count(*) from tb_backorderstatus  where entertime >= To_date('2010-04-21 08:00:00','yyyy-mm-dd hh24:mi:ss') and  entertime <= To_date('2010-05-06 08:00:00','yyyy-mm-dd hh24:mi:ss') 有511026条
如果做了加减就full scan ,
不过问题解决了,我建立了一个在tb_backorderstatus entertime 上的to_char()索引,逻辑读立马下降到11000,这可能不是最好的方法,



实际的SQL是这样的

select count(*) from tb_backorderstatus  where entertime >= To_date('2010-04-28 08:00:00','yyyy-mm-dd hh24:mi:ss')-7 and  entertime <= To_date('2010-04-29 08:00:00','yyyy-mm-dd hh24:mi:ss')+7 有511026条

如果没有加减的话
select count(*) from tb_backorderstatus  where entertime >= To_date('2010-04-28 08:00:00','yyyy-mm-dd hh24:mi:ss') and  entertime <= To_date('2010-04-29 08:00:00','yyyy-mm-dd hh24:mi:ss') 有32124条

速度是很快的做了加减就不一样了,慢的呀...

[ 本帖最后由 zwc1083 于 2010-5-15 16:24 编辑 ]

使用道具 举报

回复
论坛徽章:
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
发表于 2010-5-15 20:09 | 显示全部楼层

回复 #4 zwc1083 的帖子

1  你要看看慢在哪里, 对SQL作优化, 只是在数据库层面作优化, 若根源在于应用层, 那你拼命在数据库层作优化,
又有何意义?
2  select count(*) from tb_backorderstatus  where entertime >= To_date('2010-04-28 08:00:00','yyyy-mm-dd hh24:mi:ss')-7 and  entertime <= To_date('2010-04-29 08:00:00','yyyy-mm-dd hh24:mi:ss')+7 有511026条

这个语句只是计算个数, 因此,若时间字段(entertime)是非空的话, 并且已经建了索引, 那优化器在执行此语句时, 应该
走此索引. 你扩大日期范围后, 也只是扩大索引扫描范围, 但应该不会大多少, 你可以考虑重建索引, 看看是否加快.

使用道具 举报

回复

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

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

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