首先,抛出我心中的几个疑问:
1、分区的多少,是否会影响到性能(查询、插入等)?
三张表结构相同、数据相同的表,数据量200W条以上:
1、pt_NomalTable:普通表,并对enterDate建立了索引
2、pt_PatitionTable24:分区表,拥有24个分区,并对enterDate建立了索引,对pt_PatitionTable60的'2013-5-1'之前的数据进行了归集,即不包含该日期之前的数据了
3、pt_PatitionTable60:分区表,拥有60个分区,并对enterDate建立了索引
1、分区的多少,是否会影响到性能(查询、插入等)?
2、是否需要对分区表进行数据归集?
再抛出我的业务需求:
存在多张大数据表,之间还存在必须的JOIN关联。现在,每个月会对这些大数据表进行数据移动,原表仅保留最多3个月的数据;历史表也有专门的页面可供查询(不想将原表和历史表UNION查询)!但是,由于诸多业务限制或是操作上的问题,计算历史数据时会有结果差异。归根结底,我想 抛弃另建历史表,以备份数据的做法!
在没接触分区表前,一直致力于通过操作同步来解决。后来,研究了分区表后,也查阅了百度、谷歌上很多的文章,便出现了本文开头的两个疑问。由于条件限制,我们的数据库服务器没有做RAID。所以,只能“矮子里挑将军”了!
下面的过程,是我的一些求证。还恳请大家能不吝斧正!三张表结构相同、数据相同的表,数据量200W条以上:
1、pt_NomalTable:普通表,并对enterDate建立了索引
2、pt_PatitionTable24:分区表,拥有24个分区,并对enterDate建立了索引,对pt_PatitionTable60的'2013-5-1'之前的数据进行了归集,即不包含该日期之前的数据了
3、pt_PatitionTable60:分区表,拥有60个分区,并对enterDate建立了索引
将使用下列SQL语句进行分析:
SET STATISTICS IO ON
select * from pt_NomalTable where enterDate >= '2013-05-01' and enterDate < '2013-06-01'
select * from pt_PatitionTable24 where enterDate >= '2013-05-01' and enterDate < '2013-06-01'
select * from pt_PatitionTable60 where enterDate >= '2013-05-01' and enterDate < '2013-06-01'
先看执行计划:
通过对“Query Cost”百分比数值分析,普通表占据了很大的查询开销,说明效能低下;而24分区、60分区不相上下,效能相当。
但,pt_PatitionTable24的是2%,pt_PatitionTable60的是3%,是否预示着影响我提出的问题1呢?
然后,数据库执行信息如下:
(59411 row(s) affected)
Table 'pt_NomalTable'. Scan count 5, logical reads 576543, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(59411 row(s) affected)
Table 'pt_PatitionTable24'. Scan count 1, logical reads 2915, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(59411 row(s) affected)
Table 'pt_PatitionTable60'. Scan count 1, logical reads 2776, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
通过对上述的“Logical reads”进行分析,采用分区表之后,的确效率提高了许多,印证了即便是单磁盘,通过分区,也是可以提高查询性能的。那么,再次分析,发现24个分区和60个分区的效率并不是相差很明显,这是否说明,分区对查询效能没什么大的影响呢?如果影响不大,就无需再另建历史表,来存储归集来的数据了,而且,还要在页面中去处理这些历史数据了。
写到这,抛砖引玉,请高手路过,留下宝贵的意见。谢谢!