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

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

博客园 - 涂文瀚

常用的前端调试工具 用户中心 - 博客园 SQL中动态进行行转列 [记录]SQL SERVER 跨库操作小记 PHP常见面试问题 在WIN下搭建PHP的测试、开发环境 [转]三款免费的PHP加速器:APC eAccelerator XCache比较 Xdebug如何选择PHP版本 PHP Cookbook读书笔记 – 第01章字符串 PHP Cookbook读书笔记 – 第03章日期和时间 PHP Cookbook读书笔记 – 第02章数字 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)