分享

Sql Server2005 实现Oracle10g的hash表分区功能

 icecity1306 2014-11-01

  最近学习Oracle中,在其有hash表分区功能,就在想sql server 有类似分区吗,查了一些资料,发现没有介绍,在2005中目前只支持列表和范围分区。

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

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

  现在我们看具体实例:

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

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

         CREATE PARTITION FUNCTION [.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 [.Ps] AS PARTITION [.PF] all TO ([PRIMARY])

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

  建立分区表:

         CREATE TABLE [dbo].[](
            [id] [varchar](32) NOT NULL,
            [sid] int,
            [hashid] AS (checksum([id])) PERSISTED
        )
        ON [.Ps] ([hashid])

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

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

  插入1万条测试数据:

         insert into [](id,sid)
        select replace(newid(),'-',''),1
        from (select top 100 * from syscolumns) a
        ,(select top 100 * from syscolumns) b

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

         SELECT
            $partition.[.PF](hashid)
               AS 分区号,count(*) 数据条数
        FROM []
        group by $partition.[.PF](hashid)

  查看结果   

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

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

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

  建立hash分区的好处:

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

  2,提高性能,

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多