日期:2014-05-18  浏览次数:20597 次

主从结构的分区表是否应该使用相同的分区方案
比如有两个表,一、订单表;二、订单中的物品列表。如下
create table order
(
  orderId int identity(1,1) primary key
 ,addTime datetime
 ...
)
create table orderDetail
(
  detailId int identity(1,1) primary key
 ,orderId int --这里是外键,指向订单表的orderId
 ...
)

我现在针对order表采用的是以时间进行分区的分区方案,请问对于orderDetail表是否也该采用相同的分区方案?异或不分区、或者针对detailId or orderId的值范围进行分区的分区方案,请问各种方案有什么区别,适用何种情况?或者用更好的方案?谢谢,请了解的童鞋指教

------解决方案--------------------
请问对于orderDetail表是否也该采用相同的分区方案?
--> 建议是的.

异或不分区、或者针对detailId or orderId的值范围进行分区的分区方案,请问各种方案有什么区别,适用何种情况?
--> 建议按时间字段进行分区,以方便管理.

或者用更好的方案?
--> 各分区最好对应到不同的磁盘阵列上,主从表的对应分区最好在同个磁盘阵列上.
------解决方案--------------------
个人认为按时间分区即可。
------解决方案--------------------
order表不是有addTime字段吗?应该有个下单日期字段吧.

如果用orderId字段做分区,则在应用上可能无法体现分区表的优势





------解决方案--------------------
你可以按主表的创建日期来做分区表,主从表都按这个来。
------解决方案--------------------
如果需要做分区切换,即需要用分区将部分数据搬迁到历史表的操作,用时间或者自动增长的ID分区是可以的。但是必须注意测试表明,用非整数类型(包括INT和BIGINT)的分区往往那个效率不是很好。


如果不需要做分区切换,强烈建议不要使用时间分区,而是改用一个分布均匀的整数类型(自动增长分布极度不均匀,也不建议,可以考虑某些算法计算出一个ID,比如CRC算法等)。

另外,数据量的问题,一般应该orderDetail是order的几倍,所以考虑分区方案时优先考虑orderDetail
表,连接字段如果能作为分区字段那是最好的

所以综合建议是,用算法计算一个orderID,作为两表的连接字段和分区字段。



------解决方案--------------------
用主表的创建日期,,
------解决方案--------------------
就按时间来