发布网友 发布时间:2022-05-01 19:18
共2个回答
懂视网 时间:2022-05-01 23:39
我们的数据库已经投入使用一段时间了,但是当时没有创建创建分区表,现在我们需要做的是将普通表转换成分区表,但是并不能影响我们数据库里面的数据,那么我们应该如何做呢?只需在该表上创建一个聚集索引,并在该聚集索引中使用分区方案即可。
说的很简单,但是在实现实现可就没有那么容易了,因为你的数据库中存在主键,外键等约束关系,那么我们在将普通表转换成分区表时,首先就需要解决这些问题。
我们知道分区表时某个字段为分区条件的,除了这个字段之外的其他字段是不能创建聚集索引的,所以我们将普通表转换成分区表时,必须要删除聚集索引,然后再重新创建一个新的聚集索引,在该聚集索引中使用分区方案。
但是我们需要修改的t_sellLog表中的orderId既是主键又是聚集索引,而且还是其它表的外键。因此,我们只能先删除外键关联,再删除主键,然后重新创建orderId为主键,但是设置为非聚集索引,然后将我们的sellTime字段设置为聚集索引,最后添加上我们的外键约束,至此普通表转换成分区表的工作结束,代码如下:
--查看外键约束
use CX_Partiton_Scheme
exec sp_helpconstraint t_SellLog
--删除外键约束
alter table t_sellLog drop constraint FK_t_SellLog_t_User
--删掉主键
ALTER TABLE t_SellLog DROP constraint PK_t_SellLog
--创建主键,但不设为聚集索引
ALTER TABLE t_SellLog ADD CONSTRAINT PK_t_SellLog PRIMARY KEY NONCLUSTERED (
orderId ASC
)
ON [PRIMARY]
--创建一个新的聚集索引,在该聚集索引中使用分区方案
CREATE CLUSTERED INDEX CT_SellLog ON t_SellLog(sellTime)
ON partsch_CX([sellTime])
--添加删除掉的外键约束(具体自己根据实际情况自己实现)
转换成功之后,我们可以通过下面代码查看每个分区表中的记录数:
--统计所有分区表中的记录总数
select $PARTITION.partfun_CX([sellTime]) as 分区编号,count(orderId) as 记录数from t_SellLog group by$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()
数据库分区表(转)
标签:出错 文件 dex 数据库 分段 http 点击 数据库表 标签
热心网友 时间:2022-05-01 20:47
数据量很大,而且经常按照某个字段进行条件过滤或者分组时,可以考虑使用分区,例如某种商品的销售情况,经常要查看某个月、某个季度的销售明细或者总计,则可以根据销售日期进行分区,每个月分为一个区,而且最好是能够把不同区的数据分别存放在不同的物理硬盘上,这样在进行查询的时候,如果查询某个月的数据,可以直接在特定硬盘查询,数据量小,速度快,如果查询所有月份的数据,多块硬盘可以并行查询,速度也会明显提高。