SQL SERVER 表分區實施步奏


1. 概要說明

SQL SERVER的表分區功能是為了將一個大表(表中含有非常多條數據)的數據根據某條件(僅限該表的主鍵)拆分成多個文件存放,以提高查詢數據時的效率。創建表分區的主要步驟是1、確定需要以哪一個字段作為分區條件;2、拆分成多少個文件保存該表;3、分區函數(拆分條件);4、分區方案(按拆分函數拆分后需要對應到哪些文件組中去)。

下面就一步一步來說明如何創建表分區:

2. 准備工作

創建一個測試表

CREATE TABLE Sale(  

    [Id] [int] IDENTITY(1,1) NOT NULL,          --自動增長  

    [Name] [varchar](16) NOT NULL,  

    [SaleTime] [datetime] NOT NULL,  

    CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED  --創建主鍵  

    (  

        [Id] ASC  

    )  

)  

插入測試數據

insert Sale ([Name],[SaleTime]) values ('張三','2009-1-1')    
insert Sale ([Name],[SaleTime]) values ('李四','2009-2-1')    
insert Sale ([Name],[SaleTime]) values ('王五','2009-3-1')    
insert Sale ([Name],[SaleTime]) values ('錢六','2012-4-1')    
insert Sale ([Name],[SaleTime]) values ('趙七','2012-6-1')    
insert Sale ([Name],[SaleTime]) values ('張三','2012-6-1')    
insert Sale ([Name],[SaleTime]) values ('李四','2012-7-1')    
insert Sale ([Name],[SaleTime]) values ('王五','2012-8-1')    
insert Sale ([Name],[SaleTime]) values ('錢六','2012-10-1')    
insert Sale ([Name],[SaleTime]) values ('趙七','2012-10-1')    
insert Sale ([Name],[SaleTime]) values ('張三','2012-11-1')    
insert Sale ([Name],[SaleTime]) values ('李四','2013-12-1')    
insert Sale ([Name],[SaleTime]) values ('王五','2014-12-1')  

 

3. 實現步驟

主鍵設置

表分區需要先確定一個字段,按此字段的某個條件進行拆分,我們這里以Saletime列為例,按月為單位對Sale表進行拆分。因為需要拆分的列必須是主鍵,所以我們這里先刪除原來建表時對ID字段創建的主鍵,改為SaleTime字段(注意用非聚集主鍵

1)修改表

 

2)移除主鍵

 

3)新建主鍵

 

4)設置關聯

 

因為主鍵要求唯一性,所以這里需要做2個字段的關聯主鍵(IDSaleTime

 

5)修改主鍵為非聚集

 

成功后的效果

 

完成后記得保存表

創建文件組和數據文件

因為表分區時按照文件組為單位保存了,而實際數據是保存在這個文件組所包含的文件中的,所以為了高效率,可以一個文件組對應一個數據文件來保存數據,下面我們以月為單位創建文件組

 

到這里已經把文件組和數據文件創建完畢並建立了對應關系,點擊確定鍵后,在對應的目錄下可以看到已經生成了我們設定的12個數據文件了。

 

創建分區函數(無法可視化實現)

-- 第四步 創建分區函數
CREATE PARTITION FUNCTION partfunSale (DATETIME)   
AS RANGE RIGHT FOR VALUES (     '2012-02-01','2012-03-01','2012-04-01','2012-05-01','2012-06-01',     '2012-07-01','2012-08-01','2012-09-01','2012-10-01','2012-11-01','2012-12-01'
)

上面這段的含義是創建一個以Datetime字段類型的分區函數,需要注意的是12個文件組對應11Values,因為分區的規則是

文件組———》2012-02-01之前的數據(日期>2012-02-01
文件組———》2012-02-01之后2012-03-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-03-01之后2012-04-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-04-01之后2012-05-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-05-01之后2012-06-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-06-01之后2012-07-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-07-01之后2012-08-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-08-01之后2012-09-01之前的數據(2012-02-01≤日期<2012-03-01
文件組———》2012-09-01之后2012-10-01之前的數據(2012-02-01≤日期<2012-03-01
文件組10 ———》2012-10-01之后2012-11-01之前的數據(2012-02-01≤日期<2012-03-01
文件組11 ———》2012-11-01之后2012-12-01之前的數據(2012-02-01≤日期<2012-03-01
文件組12 ———》2012-12-01之后的數據(2012-02-01≤日期<2012-03-01

 創建分區方案(無法可視化實現)

將創建的分區函數與文件組進行關聯

-- 第四步 創建分區方案(注意要比分區函數多一項)
CREATE PARTITION SCHEME partschSale   
AS PARTITION partfunSale   
TO (      
    Saletime201201, 
    Saletime201202,   
    Saletime201203,   
    Saletime201204,   
    Saletime201205,   
    Saletime201206,   
    Saletime201207,   
    Saletime201208, 
    Saletime201209,   
    Saletime201210,   
    Saletime201211,   
    Saletime201212    )

關聯到表(無法可視化實現)

將設置好的分區方案與具體的表進行關聯

-- 第五步 設置分區方案到指定表
CREATE CLUSTERED INDEX CT_Sale ON Sale([SaleTime])  ON partschSale([SaleTime]) 

其中Sale是表名,SaleTime是拆分時依據的字段,partschSale是分區方案

創建好了以后在數據庫中右鍵表名點擊屬性可以查看到類似如下的效果表示創建成功

統計各數據組中包含的數據條數

-- 統計所有分區表中的記錄總數   
select $PARTITION.partfunSale(SaleTime) as 分區編號,count(id) as 記錄數from Sale group by $PARTITION.partfunSale(SaleTime)  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM