Sql Server 2005 实现Oracle 10g 的hash表分区功能

文/zping  出处/博客园

    以前只知道Sql Server有hash索引,本文就在Sql Server中实现Oracle里的hash表分区。在oracle 10g的hash分区保持分区数据的均匀,分的区个数是2的倍数分区才可以实现。

前段时间做了一个试验,实现了在sql server 2005的分区并保证了在hash分区中数据的分布均匀。



现在我们看具体实例:



Hash分区:将表数据均匀的分成4个区。



建立分区函数:数据如何分区(逻辑设计)

CREATE PARTITION FUNCTION [zping.com.PF](int) AS

RANGE LEFT FOR VALUES (-1073741824, 0, 1073741824)



注意:我们这里使用的int型数据,因为hash函数是checksum(id),这里根据int的最大长度进行分区,我们使用2,147,483,648/2=1073741824

这里:Range left 意思: <=

      Range right 意思: <



创建分区方案:分区数据如何物理存放(逻辑设计)

CREATE PARTITION SCHEME [zping.com.Ps] AS PARTITION [zping.com.PF] all TO ([PRIMARY])



这里的all TO ([PRIMARY]) 意思是将分区数据将存储于主文件组中



建立分区表:

CREATE TABLE [dbo].[zping.com](

    [id] [varchar](32) NOT NULL,

    [sid] int,

    [hashid] AS (checksum([id])) PERSISTED

)

ON [zping.com.Ps] ([hashid])



注意:1,这里我们使用了计算列的做为分区列,在SQL server 2005中,分区列如果是计算列,必须PERSISTED持久化

    2,我们这里使用了checksum(列)这个哈希函数,该函数用来计算id的hash值,这个函数同时可以用来建立hash索引

 



插入1万条测试数据:

insert into [zping.com](id,sid)

select replace(newid(),'-',''),1

from (select top 100 * from syscolumns) a

,(select top 100 * from syscolumns) b



查看数据的分布分区情况:

SELECT

    $partition.[zping.com.PF](hashid)

      AS 分区号,count(*) 数据条数

FROM [zping.com]

group by $partition.[zping.com.PF](hashid)



查看结果


 附件: 您所在的用户组无法下载或查看附件



  这时发现,数据分布的比较均匀。按上面方法再插入1万条数据,看看数据分区:



 附件: 您所在的用户组无法下载或查看附件


这时发现数据依旧比较均匀。



这里我们完成了一个SQL server 2005的hash分区。

建立hash分区的好处:

1,提高可伸缩性和可管理性:在SQL server 2005中建立hash分区, 改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。

2,提高性能,

  2.1,只有将数据分区分到不同的磁盘上,才会有较大的提升。

  2.2. 因为在运行涉及表间联接的查询时,多个磁头可以同时读取数据

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL Server] 的这些文章也感兴趣:

SQL Server存储图像数据的策略与方法
检测你的SQL Server是否有特洛伊木马
SQL Server 2005的DML触发器和After触发器的研究
使用SQL Server 2008管理非结构化数据
SQL Server Data Services: Microsoft's Answer to Amazon S3
在SQL Server数据库编写通用数据访问方法
SQL Server2000安装手册(用于Windows版CAMS
教你如何提高SQL Server 2000 的性能?
调整重心-从IIS到SQL Server数据库安全
开发社区对SQL Server 2008 CTP6的反响