• SqlServer2005基于已有表创建分区


          

    随着当今数据库的容量越来越快的朝着在大型数据库或超大型数据库的发展,对于数据库中的大

    型表以及具有各种访问模式的表的可伸缩性和可管理性运行环境变得尤为重要,

    SQL server

    SQL 

    server 7.0

    的分区视图到

    SQL server 2000

    中的分区视图中到

    SQL server 2005

    所使用的分区表,

    不断改

    善大型表所面临的性能、阻塞、备份空间、时间、运营成本等。当表和索引非常大的时候,通过分区

    表的实现,可以将数据分为更小,更易于管理,获得更好的可操作性能。本实验介绍基于已存在的表

    来如何创建分区,管理分区。

     

     

    一、实验目的:对于已经存在的表且不断增大的情况下构建分区表,管理分区表,提高其性能。

     

     

    二、主要步骤:对于已经存在的表,我们可以采取以下步骤来对其创建分区表

     

        

    1.

    创建分区函数

     

        

    2.

    创建分区架构并关联到分区函数

     

        

    3.

    删除已经存在的聚集索引

     

        

    4.

    基于分区架构重建聚集索引

     

     

    三、实验环境:

     

        

    1. windows xp pro (

    英文版

    ) + sp2 

     

        

    2. SQL server 2005 Developer + sp3 

        

    3.

    实验数据库

    Performance,

    此数据库参照实验二:

    SQL server 2005

    高可用性之

    ----

    数据库镜像中的生

    成脚本生成数据库,本实验对其数据库的存放做了调整,将数据和日志文件存放在

    D:SQL_DataPerformance

    目录下。

     

        

    4.

    对已存在要创建的分区表为:

    Performance

    数据库下的

    Orders

        

    5.

    Orders

    表中的

    orderdate

    列按年进行水平分区

     

     

     

    四、具体试验步骤:

         

     

        

    1.

    创建分区函数

     

           

    确定分区的数目及分区的列,

    列的数据类型。

    本例将

    Orders

    表的

    orderdate

    按年份水平分五个区,

    则需要定义四个边界点值。如下,

     

     

    use Performance; 

    go      

     

    Create partition function 

    Part_func_orders(datetime) as 

    range left 

    for values('20021231 23:59:59.997', 

                     

    '20031231 23:59:59.997', 

                     

    '20041231 23:59:59.997', 

                     

    '20051231 23:59:59.997'); 

    go 

    --

    或者使用

    range right

    来创建分区函数

     

    Create partition function 

    Part_func_orders(datetime) as 

    range right 

    for values('20030101 00:00:00.000', 

                     

    '20040101 00:00:00.000', 

                     

    '20050101 00:00:00.000', 

                     

    '20060101 00:00:00.000'); 

    go 

    /*

    分区值的表示范围

    (

    使用

    range left) 

    infinity < x1 <= 20021231 

     20030101 < x2 <= 20031231 

     20040101 < x3 <= 20041231 

     20050101 < x4 <= 20051231 

     20060101 < x5 <= +infinity 

    infinity

    本应当为

    20020101

    20061231

    ,此处仅用于说明表示范围

     

    ---------------------------------------------------------- 

    分区值的表示范围

    (

    使用

    range right) 

    infinity < x1 < 20030101 

     20030101 <= x2 < 20040101 

     20040101 <= x3 < 20050101 

     20050101 <= x4 < 20060101 

     20060101 <= x5 < +infinity 

    通过以上分析表明当

    range

    中使用

    left

    时,分区的范围右边为小于等于

    values

    所指定的值,

     

    range

    中使用

    right

    时,分区范围左边为大于等于

    values

    所指定的值。

      

     

    规律:在使用

     

    LEFT 

    分区函数时,第一个值将作为第一个分区中的上边界。在使用

     

    RIGHT 

    分区函

    数时,第一个值将作为第二个分区的下边界

    */ 

     

        

    2. 

    添加文件组和文件

     

            

    针对所创建的分区来创建文件组和文件,

    我们可以创建五个文件组,

    五个不同的

    ndf

    文件来存放

    不同年份的

    orders

    ,可以放置于不同的磁盘来减少

    I/O

    的开销,也可以在一个文件组中创建多个文件

    来存放不同年份的

    orders,

    本例创建了四个文件组,其中有一年的

    orders

    放置到了

    Primary

    组中。

     

     

    alter database Performance 

    add filegroup [FG1]; 

    go 

    alter database Performance 

    add filegroup [FG2]; 

    go 

    alter database Performance 

    add filegroup [FG3]; 

    go 

    alter database Performance 

    add filegroup [FG4]; 

    go 

    alter database Performance 

    add file 

    (name = FG1_data,filename = 'D:SQL_DataPerformanceFG1_data.ndf',size = 3MB) 

    to filegroup [FG1]; 

    alter database Performance 

    add file 

    (name = FG2_data,filename = 'D:SQL_DataPerformanceFG2_data.ndf',size = 3MB) 

    to filegroup [FG2]; 

    alter database Performance 

    add file 

    (name = FG3_data,filename = 'D:SQL_DataPerformanceFG3_data.ndf',size = 3MB) 

    to filegroup [FG3]; 

    alter database Performance 

    add file 

    (name = FG4_data,filename = 'D:SQL_DataPerformanceFG4_data.ndf',size = 3MB) 

    to filegroup [FG4]; 

    go 

     

        

    3. 

    创建分区架构并关联到分区函数

     

     

    Create partition scheme Part_func_orders_scheme 

    as partition Part_func_orders 

    to ([FG1],[FG2],[FG3],[FG4],[Primary]); 

    go 

     

        

    4.

    重建索引

    (删除聚集索引以及需要分区字段的索引后重建该类索引,

    表被按分区值将分配到各文

    件组)

     

     

    EXEC sp_helpindex N'orders' --

    查看

    orders

    中使用的索引

     

    drop index idx_cl_od 

    on orders; 

    go 

    create clustered index idx_cl_od 

    on orders(orderdate) 

    on Part_func_orders_scheme(orderdate); 

    go 

        

    5. 

    查看分区的相关情况

     

     

    --

    查看分区及分区范围的情况

     

    select * from sys.partitions where object_id = object_id('orders'); 

    select * from sys.partition_range_values; 

     

    --

    查看分区架构情况

     

    select * from sys.partition_schemes; 

     

    --

    查看某一特定分区列值属于哪个分区

     

    select Performance.$partition.Part_func_orders('20050325') as partition_num; 

     

    --

    查看某一特定分区的记录

     

    select * from orders where Performance.$partition.Part_func_orders(orderdate) = 2 

     

    --

    查看各分区所包含的记录数

     

    select $partition.Part_func_orders(orderdate) as partition_num, 

      

    count(*) as record_num 

    from orders 

     

    group by $partition.Part_func_orders(orderdate) 

    order by $partition.Part_func_orders(orderdate); 

      

        

    6.

    分区的管理

     

     

    --

    增加分区值

    ,

    增加分区之前应先增加或设置新分区使用的文件组

     

    alter database Performance 

    add filegroup [FG5]; 

    go 

     

    alter database Performance 

    add file 

    (name = FG5_data,filename = 'D:SQL_DataPerformanceFG5_data.ndf',size = 3MB ) 

    to filegroup [FG5]; 

    go 

     

    alter partition scheme Part_func_orders_scheme 

    next used [FG5]; 

    go 

    alter partition function Part_func_orders() 

    split range('20061231 23:59:59.997') 

    go 

    insert into orders 

    select 10000001,'C0000012906',213,'I','20070101','a' 

    union all select 10000002,'C0000019995',213,'I','20070109','a' 

    union all select 10000003,'C0000019996',410,'I','20070512','a'; 

    go 

    select * from orders where Performance.$partition.Part_func_orders(orderdate) = 6 

     

    --

    合并分区

     

    --

    合并分区后,以下将新增的三条记录放到了第

    5

    个分区中

     

     

    alter partition function Part_func_orders() 

    merge range('20061231 23:59:59.997'); 

    go

  • 相关阅读:
    Unknown custom element: <el-container1>
    jQuery手机对话框插件
    告别2013,迎接2014
    淘宝开放平台主动通知的实现
    搭建JavaWeb服务器
    深入理解JavaScript执行上下文和执行栈
    为什么要选择学习Java?适合零基础的初学者的文章
    成为一名优秀的Java程序员9+难以置信的公式
    深入理解JavaScript作用域和作用域链
    JavaScript数据类型转换
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3560816.html
Copyright © 2020-2023  润新知