我们的数据库已经投入使用一段时间了,但是当时没有创建创建分区表,现在我们需要做的是将普通表转换成分区表,但是并不能影响我们数据库里面的数据,那么我们应该如何做呢?只需在该表上创建一个聚集索引,并在该聚集索引中使用分区方案即可。

说的很简单,但是在实现实现可就没有那么容易了,因为你的数据库中存在主键,外键等约束关系,那么我们在将普通表转换成分区表时,首先就需要解决这些问题。

我们知道分区表时某个字段为分区条件的,除了这个字段之外的其他字段是不能创建聚集索引的,所以我们将普通表转换成分区表时,必须要删除聚集索引,然后再重新创建一个新的聚集索引,在该聚集索引中使用分区方案。

但是我们需要修改的t_sellLog表中的orderId既是主键又是聚集索引,而且还是其它表的外键。因此,我们只能先删除外键关联,再删除主键,然后重新创建orderId为主键,但是设置为非聚集索引,然后将我们的sellTime字段设置为聚集索引,最后添加上我们的外键约束,至此普通表转换成分区表的工作结束,代码如下:

   --查看外键约束

use CX_Partiton_Scheme

execsp_helpconstraint t_SellLog

--删除外键约束

altertable t_sellLog dropconstraint FK_t_SellLog_t_User

--删掉主键

ALTERTABLE t_SellLog DROPconstraint PK_t_SellLog

--创建主键,但不设为聚集索引

ALTERTABLE t_SellLog ADDCONSTRAINT PK_t_SellLog PRIMARYKEYNONCLUSTERED(

orderId ASC

)

ON [PRIMARY]

--创建一个新的聚集索引,在该聚集索引中使用分区方案

CREATE CLUSTERED INDEX CT_SellLog ON t_SellLog(sellTime)

ON partsch_CX([sellTime])      --partsch_CX为分区方案

--添加删除掉的外键约束(具体自己根据实际情况自己实现)

转换成功之后,我们可以通过下面代码查看每个分区表中的记录数:

  --统计所有分区表中的记录总数

select $PARTITION.partfun_CX([sellTime]) as 分区编号,count(orderId) as 记录数 from t_SellLog groupby $PARTITION.partfun_CX([sellTime])

我们还可以通过下面的代码,查看数据库库中的数据在哪个分区中:

  --查看数据库表中的数据在哪个分区中

select $PARTITION.partfun_CX('2010-10-1')--查询年月日的数据在哪个分区中

select $PARTITION.partfun_CX('2011-01-1')--查询年月日的数据在哪个分区中如果你想比较一下我们使用分区方案之后和之前程序有多少效率提高,我们可以通过下面的语句来看看一下脚本的执行时间就OK了,我经过测试的数据是快了0.017秒,一方面由于我们的测试数据量比较小,另一方面我的机器配置还是蛮不错的。

--查看SQL脚本的执行时间

select getDate()

select * from t_sellLog

select getDate()