SQL SERVER2005 分区表几何倍数提高网站性能

项目做到后期了,发现数据到数据在不断增长,现在是1000w多条,估计以后数据还会增加,可是现在数据库到索引也加了,在数据库做一个大大查询时,前台web会超时,很郁闷,怎么办呢,第一个想法是分库,可是分库这个表关联的太多了,并且这个表又是一对多中多大一方,不好处理,在google上工作了一天,终于让我发现了sql2005的新特性 :表分区功能

表分区功能,相当于把一张表大数据无限极细化到多张表上,多个驱动上,但是访问时却还是一样的访问,因为 其实本身并未新建任何表,并且它还可以访问其他服务器以提高速度

好了,废话不谈了,下面的步骤 依次跟着来:

 1.为数据库新建多个文件组,可分布于不同大磁盘上

ALTER DATABASE [D] 
ADD FILEGROUP [GF1]

2.一个文件组可放置多个文件,下面,只为一个文件组分配一个文件

ALTER DATABASE [D] ADD FILE ( NAME = N'GF1', FILENAME = N'E:\D\D1\DGF1.ndf' , SIZE = 5MB , FILEGROWTH = 10% )
 
TO FILEGROUP [GF1]

3.创建分区函数

CREATE PARTITION FUNCTION [D_PARTITIONFUNC] (int
        
AS RANGE LEFT FOR VALUES (200000,400000,500000)

4.将分区函数绑定到分区架构上

CREATE PARTITION SCHEME [D_PARTITION_SHEME]
AS PARTITION [D_PARTITIONFUNC]
TO ([PRIMARY],[GF1],[PRIMARY],[GF1])

注意primary表示主文件组,既是数据库建立大时候默认的

5.删除主键

ALTER TABLE dbo.B DROP CONSTRAINT [PK_B]

上一步可以不做,不过我个人推荐,因为分区键(分区函数的参数)必须建立在主键上

6.开始对表分区

ALTER TABLE  dbo.B add CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED (ID)
ON [D_PARTITION_SHEME](ID)

 

OK,完成

B表中主键ID,好了

现在即使是几百G的数据也不会有问题了

下面还有更改分区的方法以及查询分区分布大方法,现在没时间写了,

下次再补上吧。

 

 

2
0
(请您对文章做出评价)
« 上一篇:Cookie探望
» 下一篇:SQL SERVER2005 分区表几何倍数提高网站性能[2]-添加、合并、删除,查询分区
posted @ 2009-06-24 18:52 云淡风轻-.net 阅读(2460) 评论(18)  编辑 收藏 网摘

  回复  引用  查看    
#1楼2009-06-24 22:32 | 温景良(Jason)      
不错
  回复  引用    
#2楼2009-06-24 23:56 | zzz1[未注册用户]
项目做的挺大啊 连DBA都没有?
  回复  引用  查看    
#3楼2009-06-24 23:58 | peace      
顶下 以后用的着
  回复  引用  查看    
#4楼2009-06-25 00:31 | 紫色永恒      
very useful 期待后文!
  回复  引用  查看    
#5楼2009-06-25 02:03 | 情缘鸟      
不错
  回复  引用  查看    
#6楼2009-06-25 08:34 | 小猴子      
分区表成败的关键在于如何衡量分区因子。
如果一个表的查询按照时间范围来做统计的比例很高,那么提高速度是很明显的,能解决一些现实的性能问题。但实际中情况比较复杂,查询的条件往往很多,涉及到各个字段,这个时候的查询综合性能提升不高,提高IO速度,是目前解决查询性能的关键,CPU与内存一般都够用了。

  回复  引用    
#7楼2009-06-25 08:40 | moriaty[未注册用户]
确实 表分区 改善 增删改操作 但是对查询改善不大
  回复  引用  查看    
#8楼2009-06-25 08:57 | KenBlove      
--引用--------------------------------------------------
moriaty: 确实 表分区 改善 增删改操作 但是对查询改善不大
--------------------------------------------------------
分区表的关键是确定用什么来分区,要适合查询,建议可以创建一个自定义的分区键.尽量将查询结果聚合在一起.例如一般按日期查询的可以建立一个类似年份的字段做分区键,按用户查询的可以以用户范围做分区键.分析好了的确可以大大提高速度.

  回复  引用  查看    
#9楼2009-06-25 09:15 | 徐少侠      
@KenBlove
对就是这个意思

分区表建得合理,也能极大提高查询速度

  回复  引用  查看    
#10楼2009-06-25 10:31 | aimei360      
改善IO是关键。
  回复  引用    
#11楼2009-06-25 11:12 | NET剑客
看起来不错!
虽然现在还用不着,估计会有用着的时候.
谢谢楼主.

不过"更改分区的方法以及查询分区分布大方法"什么时候补上呀?

  回复  引用  查看    
#12楼2009-06-25 13:53 | 伍华聪      
引用楼主:
CREATE PARTITION FUNCTION [D_PARTITIONFUNC] (int)
AS RANGE LEFT FOR VALUES (200000,400000,500000)

现在即使是几百G的数据也不会有问题了

评述:
你只是把数据分了4个区,可是如果数据增长在500,000 ~ 5000,000的时候,而数据查询在此区间又比较频繁,你这个方法就不没有性能提高了吧,因为这是一个分区

  回复  引用  查看    
#13楼2009-06-25 14:01 | 後生哥哥      
--引用--------------------------------------------------
NET剑客: 看起来不错!
虽然现在还用不着,估计会有用着的时候.
谢谢楼主.

不过"更改分区的方法以及查询分区分布大方法"什么时候补上呀?
--------------------------------------------------------
表分区我也是刚刚在看,期待楼主的下文

  回复  引用  查看    
#14楼2009-06-25 18:19 | 徐少侠      
@伍华聪
出现这种问题,那么就继续分区。
可以对现有分区进行进一步的划分

  回复  引用  查看    
#15楼2009-06-25 18:21 | 徐少侠      
--引用--------------------------------------------------
aimei360: 改善IO是关键。
--------------------------------------------------------
分区和IO是两个相辅相成的提速策略

不能偏废某一个

即使硬盘IO提升10倍,对于大文件的读写还是慢的。
两个技术一起用那就很爽了

  回复  引用  查看    
#16楼2009-06-25 21:37 | BoyLee      
前两年看到一些论坛程序用这样的做法
  回复  引用  查看    
#17楼[楼主]2009-06-26 09:47 | 云淡风轻-.net      
@後生哥哥
我上面为了做范例,只做了一个组,四个分区,这个分区范围,完全都是可以控制大,这个倒没问题

——--------------------------
另外有个问题想跟大家讨论下,如果我数据库的表A大数据瓶颈是1000W条,我使用分区后,库里有>1000W的数据,会不会影响查询速度啊?或者说有其他的问题啊?

  回复  引用  查看    
#18楼2009-07-10 14:16 | 凯锐      
2005是很好用,但是如果是2000的話,除了建分區視圖,利用check約束以外,博主有其它的方法實現嗎?我現在有個2000的表的數據想優化一下!