为了测试这一点,实验实际上需要对表进行分区。参见http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
查询分区功能只是告诉您分区功能的含义。它没有说数据存储在哪里。您可以设置分区功能并运行它,而无需实际对表进行分区,如此处已演示的那样。
为了对表进行分区,还必须创建文件组和使用分区功能将功能结果分配给文件组的分区方案。然后,您必须在使用该分区方案的表上放置一个集群键。
设置分区
我不是命令行SQL方面的专家。我使用SSMS界面来设置文件组pfg1(带有pf1文件)和pfg2(带有pf2文件)。然后,我声明了分区功能和方案:
CREATE PARTITION FUNCTION IDRange1 (int)
AS RANGE LEFT FOR VALUES (10) ;
GO
CREATE PARTITION SCHEME ps_IDRange1
AS PARTITION IDRange1
TO (pfg1, pfg2)
GO
创建表和聚簇索引
CREATE TABLE [IDRanges](
[ID] [int] NOT NULL
)
GO
CREATE CLUSTERED INDEX PK_IDRanges
ON dbo.IDRanges(id) ON ps_IDRange1 (ID)
GO
完成此操作后,当您查询sys.partitions(我有2005)时,您会看到该表现在具有两个分区,而不只是该表的一个分区。这表明我们已经为该表完全实现了分区。
select * from sys.partitions where object_id = object_id('IDRanges')
partition_id object_id index_id partition_number hobt_id行
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 0
72057597780361216 770674389 1 2 72057597780361216 0
现在我们有了两个分区(每个分区都有一个行数),我们可以进行一个实验。
插入行
INSERT INTO IDRanges ([ID]) VALUES (17)
INSERT INTO IDRanges ([ID]) VALUES (7)
检查sys.partitions以查看发生了什么。
select * from sys.partitions where object_id = object_id('IDRanges')
partition_id object_id index_id partition_number hobt_id行
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 1
72057597780361216 770674389 1 2 72057597780361216 1
是的 每个分区一行。
移动一行。
UPDATE IDRanges
SET [ID] = 8 WHERE [ID] = 17
检查分区
select * from sys.partitions where object_id = object_id('IDRanges')
partition_id object_id index_id partition_number hobt_id行
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 2
72057597780361216 770674389 1 2 72057597780361216 0
现在,第一个分区具有两行而不是1行,第二个分区具有零行而不是2行。
我认为这可以确认该行是由于修改分区表中的集群键而自动移动的。