查看: 3669|回复: 18

对大表查询的优化

[复制链接]
论坛徽章:
1108
玉兔
日期:2012-05-03 14:35:17紫蜘蛛
日期:2012-05-03 14:35:17嫦娥
日期:2012-05-03 14:35:17红孩儿
日期:2012-05-03 14:35:17蓝色妖姬
日期:2012-05-03 14:35:17NBA大富翁
日期:2012-01-03 20:40:15海蓝宝石
日期:2012-12-21 15:48:432013年新春福章
日期:2013-07-22 15:32:38操作系统板块每日发贴之星
日期:2012-01-12 16:10:37铜牌徽章
日期:2012-11-06 13:17:03
发表于 2009-7-15 10:10 | 显示全部楼层 |阅读模式
有张TABLE TEST有20G的大小,1.5亿条数据量。
查询条件不固定,如何进行优化。
下面是部分查询的SQL:
SELECT  *
  FROM test  t
WHERE TO_CHAR (t.ass_date, 'YYYY-MM-DD') >= '2009-07-14'
   AND TO_CHAR (t.ass_date, 'YYYY-MM-DD') <= '2009-07-14'
   AND UPPER (t.keypart_lot_no) = 'EQWEQW'

stat:
        0  db block gets
    2703282  consistent gets
    2629429  physical reads
论坛徽章:
3
授权会员
日期:2006-05-08 13:31:37会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2008-02-18 08:49:13
发表于 2009-7-15 10:19 | 显示全部楼层
TO_CHAR (t.ass_date, 'YYYY-MM-DD') >= '2009-07-14'
   AND TO_CHAR (t.ass_date, 'YYYY-MM-DD') <= '2009-07-14'
   AND UPPER (t.keypart_lot_no) = 'EQWEQW'

使用道具 举报

回复
论坛徽章:
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-7-15 10:24 | 显示全部楼层
原帖由 hellokewin 于 2009-7-15 10:10 发表
有张TABLE TEST有20G的大小,1.5亿条数据量。
查询条件不固定,如何进行优化。
下面是部分查询的SQL:
SELECT  *
  FROM test  t
WHERE TO_CHAR (t.ass_date, 'YYYY-MM-DD') >= '2009-07-14'
   AND TO_CHAR (t.ass_date, 'YYYY-MM-DD')  


若是查询表, 根据查询条件建索引.

另外, 上面语句改写成(注意先对ass_date建索引)
WHERE t.ass_date between '2009-07-14 00:00:00' and '2009-07-14 23:59:59';

使用道具 举报

回复
论坛徽章:
400
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2009-7-15 10:25 | 显示全部楼层
t.ass_date到底要什么,>= and <=就是='2009-07-14'?

使用道具 举报

回复
论坛徽章:
1108
玉兔
日期:2012-05-03 14:35:17紫蜘蛛
日期:2012-05-03 14:35:17嫦娥
日期:2012-05-03 14:35:17红孩儿
日期:2012-05-03 14:35:17蓝色妖姬
日期:2012-05-03 14:35:17NBA大富翁
日期:2012-01-03 20:40:15海蓝宝石
日期:2012-12-21 15:48:432013年新春福章
日期:2013-07-22 15:32:38操作系统板块每日发贴之星
日期:2012-01-12 16:10:37铜牌徽章
日期:2012-11-06 13:17:03
 楼主| 发表于 2009-7-15 10:27 | 显示全部楼层
原帖由 〇〇 于 2009-7-15 10:25 发表
t.ass_date到底要什么,>= and  


是的。

这仅仅是巧合了。
可以为:
WHERE TO_CHAR (t.ass_date, 'YYYY-MM-DD') >= '2009-07-12'
   AND TO_CHAR (t.ass_date, 'YYYY-MM-DD') <= '2009-07-14'

使用道具 举报

回复
论坛徽章:
1108
玉兔
日期:2012-05-03 14:35:17紫蜘蛛
日期:2012-05-03 14:35:17嫦娥
日期:2012-05-03 14:35:17红孩儿
日期:2012-05-03 14:35:17蓝色妖姬
日期:2012-05-03 14:35:17NBA大富翁
日期:2012-01-03 20:40:15海蓝宝石
日期:2012-12-21 15:48:432013年新春福章
日期:2013-07-22 15:32:38操作系统板块每日发贴之星
日期:2012-01-12 16:10:37铜牌徽章
日期:2012-11-06 13:17:03
 楼主| 发表于 2009-7-15 10:29 | 显示全部楼层
原帖由 ZALBB 于 2009-7-15 10:24 发表


若是查询表, 根据查询条件建索引.

另外, 上面语句改写成(注意先对ass_date建索引)
WHERE t.ass_date between '2009-07-14 00:00:00' and '2009-07-14 23:59:59';


嗯。如果构建TABLE查询的语句很灵活,基本上全部字段都可以查询,如果都建立INDEX,那恐怕系统吃不消。
每天都有20多万的数据插入,维护INDEX时很耗资源和时间。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2007-06-06 11:05:312010广州亚运会纪念徽章:保龄球
日期:2010-11-29 10:29:202011新春纪念徽章
日期:2011-02-18 11:43:35
发表于 2009-7-15 10:32 | 显示全部楼层
如果没有猜错的话,ass_date字段应该是date(即使用索引),你那么to_char是不会用到索引
将执行计划贴出来看一下

将表改为分区表试 下

使用道具 举报

回复
论坛徽章:
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-7-15 10:34 | 显示全部楼层
原帖由 hellokewin 于 2009-7-15 10:29 发表


嗯。如果构建TABLE查询的语句很灵活,基本上全部字段都可以查询,如果都建立INDEX,那恐怕系统吃不消。
每天都有20多万的数据插入,维护INDEX时很耗资源和时间。


可以考虑作分区, 见分区索引, 这样插入时INDEX的操作会影响小些.

否, 又是大表, 又是常用, 又要查询快, 这本身就是有矛盾的设计.

使用道具 举报

回复
论坛徽章:
400
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2009-7-15 10:42 | 显示全部楼层
lz的可能是电信,银行等项目打印对账单

使用道具 举报

回复
论坛徽章:
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-7-15 10:52 | 显示全部楼层
原帖由 〇〇 于 2009-7-15 10:42 发表
lz的可能是电信,银行等项目打印对账单


若是这样, 那真离不开日期, 作时间范围分区最合适.

使用道具 举报

回复

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

本版积分规则 发表回复

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