关于SQL Server的分区表

关于SQL Server数据分区技术是在SQL Server 2005的时候就引入的,这里我只是想从测试的角度说明怎样去检查一个数据库的分区是否正确.
 
我们可以利用下面的代码进行数据分区的检查.
SELECT CONVERT( VARCHAR(16), PS.[name] )AS Partition_Scheme,
  P.partition_number,
  CONVERT( VARCHAR(10), DS2.[name])AS PartionFileGroup,
  CONVERT( VARCHAR(19), COALESCE( V.[Value], '' )) AS Range_Boundry,
  STR( P.Rows, 9 ) AS Rows
FROM sys.Indexes I
INNER JOIN sys.partition_schemes  PS ON I.data_space_id  = PS.data_space_id
INNER JOIN sys.destination_data_spaces DDS ON PS.data_space_id = DDS.partition_scheme_id
INNER JOIN sys.data_spaces    DS2 ON DDS.data_space_id = DS2.data_space_id
INNER JOIN sys.partitions    P ON DDS.destination_id = P.partition_number
AND P.[Object_id]  = I.[Object_ID] AND P.index_id    = I.index_id
INNER JOIN sys.partition_functions  PF ON PS.function_id  = PF.function_id
LEFT  JOIN sys.partition_range_values V ON PF.function_id  = V.function_id
AND V.boundary_id  = P.partition_number - pf.boundary_value_on_right
WHERE i.[object_id] = OBJECT_ID( 'PartitionTable' ) AND  i.index_id  = 0
ORDER BY P.partition_number
 
举个例子:
--Creatinmg Partition Function
CREATE PARTITION FUNCTION PartiFunc( INT )
AS RANGE LEFT FOR VALUES
( 1, 10, 100, 1000, 10000, 100000, 1000000 )
--Creatinmg Partition Scheme
CREATE PARTITION SCHEME PartiSche
AS PARTITION PartiFunc ALL TO ( [PRIMARY] )
--Creatinmg Partition Table
CREATE TABLE dbo.PartitionTable
( RowID INT  IDENTITY(1, 1),
 Number INT
)ON PartiSche ( RowID )
INSERT dbo.PartitionTable
(  Number )
SELECT ROW_NUMBER() OVER( ORDER BY [name] ) AS RID
FROM sys.all_objects
--View of partiton Recrds
SELECT CONVERT( VARCHAR(16), PS.[name] )AS Partition_Scheme, P.partition_number,
  CONVERT( VARCHAR(10), DS2.[name])AS PartionFileGroup,
  CONVERT( VARCHAR(19), COALESCE( V.[Value], '' )) AS Range_Boundry,
  STR( P.Rows, 9 ) AS Rows
FROM sys.Indexes I
  INNER JOIN sys.partition_schemes  PS ON I.data_space_id  = PS.data_space_id
  INNER JOIN sys.destination_data_spaces DDS ON PS.data_space_id = DDS.partition_scheme_id
  INNER JOIN sys.data_spaces    DS2 ON DDS.data_space_id = DS2.data_space_id
  INNER JOIN sys.partitions    P ON DDS.destination_id = P.partition_number AND
              P.[Object_id]  = I.[Object_ID] AND
              P.index_id   = I.index_id
  INNER JOIN sys.partition_functions  PF ON PS.function_id  = PF.function_id
  LEFT  JOIN sys.partition_range_values V ON PF.function_id  = V.function_id AND
              V.boundary_id  = P.partition_number - pf.boundary_value_on_right
WHERE i.[object_id] = OBJECT_ID( 'PartitionTable' ) AND
  i.index_id  = 0
ORDER BY P.partition_number
CREATE PARTITION FUNCTION myPartFn ( NUMERIC (18,2) ) AS RANGE LEFT FOR VALUES( 5000, 10000, 15000, 20000, 25000 )
/* <=5000, >5000 AND <=10000, >10000 AND <=15000, >15000 AND <=20000, >20000 AND <=25000, >25000 */
--CREATE PARTITION FUNCTION myPartFn ( NUMERIC (18,2) ) AS RANGE RIGHT FOR VALUES( 5000, 10000, 15000, 20000, 25000 )
/* <5000, >=5000 AND <10000, >=10000 AND <15000, >=15000 AND <20000, >=20000 AND <25000, >=25000 */
CREATE PARTITION SCHEME myPartSchm AS PARTITION myPartFn ALL TO ([PRIMARY])
SELECT * FROM sys.partition_functions; SELECT * FROM sys.partition_schemes;
CREATE TABLE dbo.myPartitionTable
( EmployeeID INT IDENTITY(1,1), SalaryAmt NUMERIC(18, 2) ) ON myPartSchm( SalaryAmt )
CREATE CLUSTERED INDEX C_INDX_myPartitionTable_00001 ON dbo.myPartitionTable( EmployeeID )
CREATE NONCLUSTERED INDEX NC_INDX_myPartitionTable_00001 ON dbo.myPartitionTable( SalaryAmt )
SELECT * FROM sys.partitions WHERE [object_id] = OBJECT_ID(N'dbo.myPartitionTable')
INSERT INTO dbo.myPartitionTable( SalaryAmt )
SELECT 2000 UNION ALL SELECT 2500 UNION ALL SELECT 3000 UNION ALL SELECT 3500 UNION ALL SELECT 5000 UNION ALL
SELECT 6000 UNION ALL SELECT 7300 UNION ALL SELECT 7500 UNION ALL SELECT 9800 UNION ALL SELECT 8900 UNION ALL
SELECT 11000 UNION ALL SELECT 7890 UNION ALL SELECT 15200 UNION ALL SELECT 17500 UNION ALL SELECT 2500 UNION ALL
SELECT 25000 UNION ALL SELECT 78000 UNION ALL SELECT 65000 UNION ALL SELECT 22000 UNION ALL SELECT 20000
SELECT * FROM dbo.myPartitionTable WHERE SalaryAmt <= 5000
SELECT * FROM sys.partitions WHERE [object_id] = OBJECT_ID(N'dbo.myPartitionTable')
DROP TABLE dbo.myPartitionTable
DROP PARTITION SCHEME myPartSchm
DROP PARTITION FUNCTION myPartFn
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14321372/viewspace-611393/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14321372/viewspace-611393/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值