几千万条纪录,如何通过分区来提高查询性能?

[复制链接]
查看11 | 回复9 | 2006-5-6 22:39:09 | 显示全部楼层 |阅读模式
一业务环境,某个查询很慢,一般需要几分钟到十几分钟才有结果,检查发现是一保存了好几年的历史表数据, 其实一般都只是查询本年度的数据, 请问如何优化?
大概查询可能如下(当然实际复杂很多):
select a,b,c,d from his where a = '未确定';
当然,如果开发人员在SQL中加入一个时间的限制,如:
select a,b,c,d from his where a = '未确定' and orderdate > toyear;
感觉能改善。
但如果开发人员不修改, 能否解决问题?
分区? 使用全局索引? 还上局部索引?
补充点说明:表中有3-4千万条纪录,但查询返回一般只有几十条纪录,而且基本上都上本年度的,但查询又没有利用到日期字段对应的索引
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
条件里都没有分区字段,自然分区不会改善性能,考虑一下索引和sql语句,要比分区更有效果。
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
同意楼上
看看执行计划先
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
把历史数据备份,然后删除,如果开发人员不改语句,i/o也是问题,几千万的数据网络传输也要点时间,优化不到那去,建议开发人员该语句,把索引建好.
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
我们也面临此类问题,目前的做法是采用分区+索引,但似乎还需要改善,关注...
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
最初由 aiirii 发布
[B]一业务环境,某个查询很慢,一般需要几分钟到十几分钟才有结果,检查发现是一保存了好几年的历史表数据, 其实一般都只是查询本年度的数据, 请问如何优化?
大概查询可能如下(当然实际复杂很多):
select a,b,c,d from his where a = '未确定';
当然,如果开发人员在SQL中加入一个时间的限制,如:
select a,b,c,d from his where a = '未确定' and orderdate > toyear;
感觉能改善。
但如果开发人员不修改, 能否解决问题?
分区? 使用全局索引? 还上局部索引? [/B]

第一条语句如果分区的话也不会有太大的性能改善,第二条语句如果根据orderdate分区会好一些。是否分区取决于你的应用和需求。如果a列是重复值很多的低基数列,可以考虑创建个位图索引,当然前提是你的应用不是OLTP,是数据仓库环境。不过位图索引回表扫描的话性能不会有提升,有可能更差。一句话,取决于业务和应用,如果是数据仓库环境的话,可以适当采用并行技术。
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
偶有上7亿数据的分区表,一张表。晕死了。
有些过分的业务需求要查询2年数据,三张表关联
一张3亿分区表,一张2亿分区表,一张400万普通表。
想建索引,都不知道要建到什么时候,前期设计的考虑太少了。
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
最初由 OmarChina 发布
[B]偶有上7亿数据的分区表,一张表。晕死了。
有些过分的业务需求要查询2年数据,三张表关联
一张3亿分区表,一张2亿分区表,一张400万普通表。
想建索引,都不知道要建到什么时候,前期设计的考虑太少了。 [/B]

了解了应用,有一定的数据库优化知识,一切都好搞


回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
最初由 blue_prince 发布
[B]
了解了应用,有一定的数据库优化知识,一切都好搞

[/B]

恩。不了解业务情况。是不行的。
回复

使用道具 举报

千问 | 2006-5-6 22:39:09 | 显示全部楼层
如果CPU 够多,就加并行,我和喜欢的一个特性..
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行