<h2>1、 需求说明</h2>
<p>将数据库Demo中的表按照日期字段进行水平分区分表。要求数据文件按一年一个文件存储,且分区的分割点会根据时间的增长自动添加(例如现在是2017年1月1日,将其作为一个分割点,即将2017年1月1日之前的数据存储到数据文件A中,将2017年1月1日的之后的数据存储到数据文件B中;当时间到2018年1月1日时,自动将2018年1月1日添加为一个新的分区分割点,并将2017年1月1日至2018年1月1日的数据存储在数据文件B中,将2018年1月1日之后的数据存储在一个新的数据文件C中,以此类推)。</p>
<h2>2、实现思路</h2>
<h3>2.1分区原理</h3>
<p>要实现这一功能,首先要了解数据库对水平分区表进行分区存储的原理。</p>
<p>所谓水平分区分表,就是把逻辑上的一个表,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理。</p>
<h3>2.2 水平分区优点</h3>
<p>l 便于存档</p>
<p>l 便于管理:备份恢复时可以单一的备份或者恢复某一个分区</p>
<p>l 提高可用性:一个分区故障,不影响其他分区的正常使用</p>
<p>l 提高性能:提升查询数据的速度</p>
<h3>2.3 实现思路</h3>
<p>① 创建数据库</p>
<p>② 在创建的数据库中添加文件组</p>
<p>③ 在文件组中添加新的文件</p>
<p>④ 定义分区函数</p>
<p>⑤ 定义分区架构</p>
<p>⑥ 定义分区表</p>
<p>⑦ 定义代理作业,自动添加分区分割点</p>
<p>⑧ 测试数据</p>
<p>注意:</p>
<p>² 分区表依赖于分区架构,而分区架构又依赖与分区函数,所以在穿件分区函数、分区架构、分区表是要按照对应的顺序创建。</p>
<p>² 分区函数并不属于具体的分区架构和分区表,它们之间仅仅是使用关系。</p>
<p>² 分区表只能在创建的时候指定为分区表</p>
<h2>3、实现步骤<br>
</h2>
<h3>3.1代码创建分区表</h3>
<h4>3.1.1 创建数据库</h4>
<p>新建数据库,并将其命名为Demo</p>
<h4>3.1.2 添加文件组</h4>
<p>代码格式:</p>
<blockquote>
<p>ALTER DATABASE <数据库名称> ADD FILEGROUP<文件组名></p>
</blockquote>
<p>代码示例:</p>
<blockquote>
<p>ALTER DATABASE DemoADD FILEGROUP DemoFileGroup</p>
</blockquote>
<h4>3.1.3 添加文件</h4>
<p>代码格式:</p>
<blockquote>
<p>ALTER DATABASE <数据库名称> ADD FILE <数据标识> TO FILEGROUP<文件组名称></p>
</blockquote>
<p>注意:数据标识中name为逻辑文件名、filename为物理文件路径名、size为文件初始大小(单位:kb/mb/gb/tb)、filegrowth为文件自动增量(单位:kb/mb/gb/tb)、maxsize为文件增大的最大大小(单位:kb/mb/gb/tb/unlimited)</p>
<p>代码示例:</p>
<div class="blockcode">
<pre class="brush:sql;">
ALTER DATABASEDemo ADD FILE (
NAME='DemoFile1',
FILENAME='D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DemoFile1.mdf',
SIZE=5MB,
FILEGROWTH=5MB)
TOFILEGROUP DemoFileGroup</pre>
</div>
<p>在此我们重复执行示例代码,在示例文件组下添加三个文件。</p>
<h4>3.1.4 定义分区函数</h4>
<p> 分区函数是用于判定数据行该属于哪个分区,通过分区函数中设置边界值来使得根据行中特定列的值来确定其分区。</p>
<p>代码格式:</p>
<blockquote>
<p>CREATE PARTITIONFUNCTION partition_function_name( input_parameter_type )</p>
<p> ASRANGE [ LEFT | RIGHT ]</p>
<p> FORVALUES ( [ boundary_value [ ,...n ] ] )</p>
<p> [ ; ]</p>
</blockquote>
<p>其中“LEFT”和“RIGHT”决定了“VALUES”中的边界值被划分到哪一个分区中(即,边界值属于左侧分区还是右侧分区)。</p>
<p>代码示例:</p>
<div class="blockcode">
<pre class="brush:sql;">
CREATE PARTITIONFUNCTION DemoPartitionFunction( datetime2(0) )
ASRANGE RIGHT
FORVALUES ('2016-01-01 00:00:00','2017-01-01 00:00:00')</pre>
</div>
<p>查看分区函数是否创建成功:</p>
<blockquote>
<p>SELECT * FROM sys.partition_functions</p>
</blockquote>
<h4>3.1.5 定义分区架构</h4>
<p>定义完分区函数仅仅是知道了如何将列的值区分到了不同的分区,而每个分区的存储方式,则需要分区构架来定义。分区构架仅仅是依赖分区函数.分区构架中负责分配每个区属于哪个文件组,而分区函数是决定如何在逻辑上分区。</p>
<p>代码格式:</p>
<blockquote>
<p>CREATE PARTITIONSCHEME partition_scheme_name</p>
<p> ASPARTITION partition_function_name</p>
<p> [ ALL ]TO ( { file_group_name | [ |
|