12
返回列表 发新帖
楼主: btwocn

[讨论] 求助:一个600W数据表查询的速度优化

[复制链接]
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
11#
发表于 2012-10-15 09:40 | 只看该作者
anlinew 发表于 2012-10-10 09:02
对于当前的sql楼上建索引的建议应该是有效的
不过索引的建立需要综合考虑全局的应用场景,或者反过来看SQL ...

这个问题很棘手,开发永远都是以实现功能为第一要务,并不会考虑到效率问题。而且,即使有编码规范,也很难面面俱到,并且,实际完全符合规范的情况还是很少见的。
开发人员的工作经历、项目经验、甚至“师傅”的不同,都可能导致出现千奇百怪的SQL

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
12#
发表于 2012-10-15 23:54 | 只看该作者
>> 不过索引的建立需要综合考虑全局的应用场景
> 这个问题很棘手,开发永远都是以实现功能为第一要务,并不会考虑到效率问题

I agree that "开发永远都是以实现功能为第一要务". But I have to comment that performance cannot be completely ignored when developers work on functionality. Any type of work, not limited to Oracle database, is prioritized by the benefit-to-effort ratio. If great performance gain can be achieved without too much effort, it must be incorporated into the work even though 实现功能 is 第一要务. If too much effort is needed to gain a little in performance, then it's either placed at the low end of the to-do list or discarded altogether. Adding a good index usually brings about tens to thousands of times of performance gain. It's likely to be high on the priority list.

使用道具 举报

回复
论坛徽章:
74
双鱼座
日期:2015-11-07 19:09:58奥运会纪念徽章:皮划艇静水
日期:2016-09-06 18:21:46乌索普
日期:2016-10-27 18:36:03蒙奇·D·路飞
日期:2016-11-18 18:51:29
13#
发表于 2012-10-16 10:23 | 只看该作者
>> 不过索引的建立需要综合考虑全局的应用场景
> 这个问题很棘手,开发永远都是以实现功能为第一要务,并不会考虑到效率问题
功能与效率对开发来讲应该是同等重要的,在数据库设计阶段就应该考虑到
如果做开发只把实现功能当作自己的目标,那什么时候有软件工程的意识呢,只能一直编码了
dba只是在优化sql,与程序员也没什么区别
如果能从系统的角度综合考虑功能,效率,安全,维护性,人机交互等等,
肯定要多费力,效果会好很多

使用道具 举报

回复
论坛徽章:
3
奥运纪念徽章
日期:2012-12-06 09:21:40鲜花蛋
日期:2013-01-10 11:05:462013年新春福章
日期:2013-02-25 14:51:24
14#
发表于 2012-10-17 22:39 | 只看该作者
我觉得可以从最下面的那个full scan的表开始分析,看看能不能用索引

使用道具 举报

回复
论坛徽章:
3
奥运纪念徽章
日期:2012-12-06 09:21:40鲜花蛋
日期:2013-01-10 11:05:462013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2012-10-17 22:42 | 只看该作者
600万的数据量,还这么多leftjoin,我觉得可以用物化视图或者存储过程了,如果每次查这些关联估计都卡的要死,如果用物化视图或者存储过程放在一个结果表里,就可以减少很多次执行了。

使用道具 举报

回复
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00马上加薪
日期:2014-10-21 18:48:25马上加薪
日期:2014-10-21 18:48:312015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39沸羊羊
日期:2015-06-11 17:08:14巨蟹座
日期:2015-07-10 09:11:44天枰座
日期:2016-01-18 10:58:39秀才
日期:2016-02-18 10:08:14秀才
日期:2016-06-23 14:15:06
16#
发表于 2012-10-18 14:29 | 只看该作者
本帖最后由 stevendba 于 2012-10-18 14:30 编辑

我看到了where 1 = 1,这个查询条件应该是拼装的吧。即使改了这条语句也难免保证其他的查询条件不会生成耗性能的sql,最好从业务出发
1. 这是个订单表,应该有流程的,流程结束的数据分出去
2. 有些计算的活能否在代码中实现,开发总想着什么功能都一句sql搞定

使用道具 举报

回复
论坛徽章:
5
2011新春纪念徽章
日期:2011-02-18 11:43:35ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:09
17#
发表于 2012-10-26 11:53 | 只看该作者
问题就在那张全表扫描的表上面,性能这么差,处理那张表就行了。

使用道具 举报

回复
论坛徽章:
2
生肖徽章2007版:兔
日期:2011-01-20 12:58:492011新春纪念徽章
日期:2011-02-18 11:43:35
18#
发表于 2012-10-26 14:41 | 只看该作者
几乎全部是嵌套循环,驱动表的选择可能存在些问题,从内向外的成本几乎没有发生变化。

使用道具 举报

回复
论坛徽章:
35
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25劳斯莱斯
日期:2013-11-04 15:42:11奥迪
日期:2013-11-04 15:42:11福特
日期:2013-11-04 15:42:11比亚迪
日期:2013-11-02 11:33:55法拉利
日期:2013-11-10 17:40:262014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有对象
日期:2014-03-06 14:09:44马上有房
日期:2014-05-06 18:40:39
19#
发表于 2012-12-24 14:34 | 只看该作者
本帖最后由 starhot 于 2012-12-24 14:35 编辑

No#1:
----
FROM ORDER_COMMODITY A,
               COMMODITY_INFO  B
         WHERE A.SHOP_ID = B.SHOP_ID(+)
           AND A.COMMODITY_CODE = B.COMMODITY_CODE(+)
---针对个子查询,你完全可以不用  COMMODITY_INFO,因为你select的字段中都没有用到B的字段。因你在处理这两个表的过程中使用的是外连接。

如此修改就可以针对ORDER_MAIN 和 ORDER_COMMODITY进行直接连接

NO#2:索引可定是要维护的。如果ORDER_MAIN 这个表的记录两变更频繁,即每天产生的业务量很多,可以考虑分区于字段ORDER_START_TIME上 (OLTP系统上要慎重需要做评估,这个动作对性能的影响是否在允许范围类)。同时可以考虑在这个上建立local index.

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
20#
发表于 2012-12-28 10:36 | 只看该作者
anlinew 发表于 2012-10-10 09:02
对于当前的sql楼上建索引的建议应该是有效的
不过索引的建立需要综合考虑全局的应用场景,或者反过来看SQL ...

没太仔细看,看了一眼执行计划,每个step的基数都是1,有点奇怪。

使用道具 举报

回复

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

本版积分规则 发表回复

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