当前位置:Gxlcms > 数据库问题 > SQL Server 分区表

SQL Server 分区表

时间:2021-07-01 10:21:17 帮助过:15人阅读

  CREATE TABLE OrderRecords
  (
      Id int,
      OrderId int,
      SalesDate Date 
  )
  ON SchemaForParirion(SalesDate)    --SchemaForPartition是刚刚定义的分区架构,括号内为指定的分区列
技术分享

  然后手工向数据库里面添加3条数据:

  技术分享

  然后执行查询:

技术分享
select convert(varchar(50), ps.name) as partition_scheme,
p.partition_number, 
convert(varchar(10), ds2.name) as filegroup, 
convert(varchar(19), isnull(v.value, ‘‘), 120) as range_boundary, 
str(p.rows, 9) as rows
from sys.indexes i 
join sys.partition_schemes ps on i.data_space_id = ps.data_space_id 
join sys.destination_data_spaces dds
on ps.data_space_id = dds.partition_scheme_id 
join sys.data_spaces ds2 on dds.data_space_id = ds2.data_space_id 
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 
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(‘OrderRecords‘)    --此处是表名
and i.index_id in (0, 1) 
order by p.partition_number
技术分享

  可以看到,分区起作用了:

  技术分享

分区表的分割

  分区表的分割,相当于新建一个分区,将原有的分区需要分割的内容插入新的分区,然后删除老的分区的内容。
  新加入多一个分割点:2009-01-01。如下图所示:

   技术分享 

  对于上图的操作,如果分割时,被分割的分区3内有内容需要分割到分区4,则这些数据需要被复制到分区4,并删除分区3上对应的数据。

  这种操作非常非常消耗IO,并且在分割的过程中锁定分区3内的内容,造成分区3的内容暂时不可用。而且,这个操作生成的日志内容将会是被转移数据的4倍。 

  因此,最好在建表的时候,就要考虑到以后的分割点,比如预判到2014-01-01,2016-01-01。

  分割现有的分区需要两个步骤:

 

  1. 首先要告诉SQL Server新建立的分区放到哪个文件组
  2. 建立新的分割点。

 

  加一条数据,致使原表如下:

  技术分享

  执行那个长查询,显示如下:

  技术分享

  现在,可以执行分割操作了:

  --分割出来的分区数据存在在哪个文件组
  ALTER PARTITION SCHEME SchemaForParirion NEXT USED ‘PRIMARY‘
  --添加分割点
  ALTER PARTITION FUNCTION fnPartition()
  SPLIT RANGE(‘2009-01-01‘)

  执行完之后,再看结果如下:

  技术分享

分区表的合并

  分区的合并可以旱作是分区分割的逆操作。分区的合并需要提供分割点,并且这个分割点必须在现有的分割表中已经存在,否则进行合并时就会报错。

  例如,对以上例子,根据2009-01-01来进行合并:

  技术分享

   合并分区操作:

  --提供分割点,合并分区
  ALTER PARTITION FUNCTION fnPartition()
  MERGE RANGE(‘2009-01-01‘)

  再来看分区信息:

   技术分享

  在这里应该注意到一个问题,假设已经合并了分区,那么合并之后,文件是存在分区3的文件组呢,还是分区4的文件组呢?这个取决于我们刚开始时定义的分区函数是left还是right。如果定义的是left,则左边的分区3合并到分区4。如果是right,则右边的分区4合并到分区3.

   技术分享

  最后附上一句:CareySon大牛,我爱你。

  本文学习自:http://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html

SQL Server 分区表

标签:str   adb   c89   行合并   基本   9.png   中文   html   设置   

人气教程排行