惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 涂文瀚

常用的前端调试工具 如何在IIS7(WIN2008)中部署你的MVC网站 - 涂文瀚 SQL中动态进行行转列 [记录]SQL SERVER 跨库操作小记 PHP常见面试问题 在WIN下搭建PHP的测试、开发环境 [转]三款免费的PHP加速器:APC eAccelerator XCache比较 Xdebug如何选择PHP版本 PHP Cookbook读书笔记 – 第01章字符串 PHP Cookbook读书笔记 – 第02章数字 PHP Cookbook读书笔记 – 第03章日期和时间 - 涂文瀚 PHP Cookbook读书笔记 – 第04章数组 PHP Cookbook读书笔记 – 第06章函数 - 涂文瀚 PHP Cookbook读书笔记 – 第07章类和对象 PHP Cookbook读书笔记 – 第08章web基础 - 涂文瀚 设计模式之观察者模式 PHP Cookbook读书笔记 – 第09章表单 - 涂文瀚 PHP Cookbook读书笔记 – 第11章Session和持久化 - 涂文瀚 PHP Cookbook读书笔记 – 第12章XML
SQL SERVER 表分区实施步奏
涂文瀚 · 2013-01-05 · via 博客园 - 涂文瀚

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)