用此函数可以创建sql server 的hash partition(哈希分区).
从所周知,sql server 2005 只有列表分区,范围分区.
使用checksum函数可以创建相应的hash partition.
建立分区函数:
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 sche_fun_hash AS PARTITION fun_hash all TO ([PRIMARY])
CREATE TABLE [dbo].test(
[id] [varchar](32) NOT NULL,
[sid] int,
[hashid] AS (checksum([id])) PERSISTED
)
ON sche_fun_hash ([hashid])
插入数据并查看数据分布情况:
insert into test(id,sid)
select replace(newid(),'-',''),1
from (select top 100 * from syscolumns) a
,(select top 100 * from syscolumns) b
SELECT
$partition.fun_hash(hashid)
AS 分区号,count(*) 数据条数
FROM test
group by $partition.fun_hash(hashid)
查看结果:
分区号 数据条数
3 2438
1 2527
4 2532
2 2503
基本做到了分布均匀.
-------------------------------
上例中,查看内部相关系统数据:
SELECT TOP 20 * FROM sys.tables t WHERE t.name='TEST' SELECT TOP 20 * FROM sys.indexes i WHERE [object_id]='1829581556' SELECT TOP 20 * FROM sys.partitions WHERE [object_id]='1829581556' SELECT TOP 20 * FROM sys.allocation_units au WHERE ALLOCATION_UNIT_ID='72057594043301888'