Sql Server系列:分区表操作

论坛 期权论坛 脚本     
匿名技术用户   2021-1-14 10:50   24   0

http://www.cnblogs.com/libingql/p/4087598.html

往年的数据几乎不做操作或只做查询操作,这种情况可以使用分区表

分区可以对表的操作通过并行的方式进行,可以提升访问性能。


--这里需要注意分区表不能再创建聚集索引,
--因为聚集索引可以将记录在物理上顺序存储,
--而分区表是将数据存储在不同的表中,这两个概念是冲突的,
--所以在创建分区表时不能再创建聚集索引


--如果:你要分2个区,你要一共有3个文件,多出来那个是为了准备给下一个分区用的。


一. 创建分区表步骤

  创建分区表的步骤分为5步:

  (1)创建数据库文件组

  (2)创建数据库文件

  (3)创建分区函数

  (4)创建分区方案

  (5)创建分区表


1、创建 数据库文件组


2、创建 数据库文件


--查看数据库文件组

select * from sys.filegroups


3、创建 分区函数
--Function_DateTime 分区函数名称
create partition function Function_DateTime(DATETIME)
AS RANGE RIGHT
for values('2010-01-01','2011-01-01') --values 每个分区指定的边界值


--查看分区函数
select * from sys.partition_functions

4、创建 分区方案
--分区方案的作用是将分区函数生成的分区映射到文件组中去,
--分区方案是让SQL Server将已分区的数据放在哪个文件组中。

--创建分区方案 Scheme_DateTime
create partition scheme Scheme_DateTime
as partition Function_DateTime --使用分区方案的分区函数的名称
TO (SECTION2010,SECTION2011,SECTION2012)--将分区映射到文件组

--如果:你要分2个区,你要一共有3个文件,多出来那个是为了准备给下一个分区用的。


--查看已创建的分区方案
SELECT * FROM sys.partition_schemes


5、创建分区表

CREATE TABLE [Order]
(
OrderID INT IDENTITY(1,1) NOT NULL,
UserID INT NOT NULL,
TotalAmount DECIMAL(18,2) NULL,
OrderDate DATETIME NOT NULL
) ON Scheme_DateTime ( OrderDate ) --分区方案Scheme_DateTime 分区列OrderDate

--这里需要注意分区表不能再创建聚集索引,
--因为聚集索引可以将记录在物理上顺序存储,
--而分区表是将数据存储在不同的表中,这两个概念是冲突的,
--所以在创建分区表时不能再创建聚集索引。



二、操作分区表

--Insert数据
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,10.00 ,'2009-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,20.50 ,'2009-12-31');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (2 ,40.00 ,'2010-01-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (3 ,40.00 ,'2010-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (4 ,50.00 ,'2011-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2012-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2012-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (6 ,70.00 ,'2013-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (10 ,90.00 ,'2014-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (9 ,100.00 ,'2015-10-20');

--查询数据所在物理分区表
--$PARTITION.分区函数名(表达式)
--调用分区函数并返回数据所在物理分区的编号
SELECT $PARTITION.Function_DateTime('2010-01-01')



--查看物理分区表中存放的记录
SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 1
SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 2
SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 3



SELECT $PARTITION.Function_DateTime(OrderDate) AS 分区编号, COUNT(1) AS 记录数
FROM [Order]
GROUP BY $PARTITION.Function_DateTime(OrderDate)



--修改分区表数据
UPDATE dbo.[Order] SET OrderDate='2015-01-01' WHERE OrderID = 3

--将普通表转换为分区表

删除表聚集索引,创建非聚集索引

CREATE TABLE Product
(
    ProductID INT IDENTITY(1,1) NOT NULL,
    ProductName VARCHAR(100) NOT NULL,
    UnitPrice DECIMAL(18,2) NULL,
    CreateDate DATETIME NOT NULL,
    CONSTRAINT PK_Product PRIMARY KEY CLUSTERED (ProductID)
)

INSERT INTO [dbo].[Product] ([ProductName],[UnitPrice],[CreateDate]) VALUES ('LINQ to SQL' ,10 ,'2012-01-01');
INSERT INTO [dbo].[Product] ([ProductName],[UnitPrice],[CreateDate]) VALUES ('LINQ to XML' ,10 ,'2012-12-01');
INSERT INTO [dbo].[Product] ([ProductName],[UnitPrice],[CreateDate]) VALUES ('LINQ to Object' ,10 ,'2013-02-01');
INSERT INTO [dbo].[Product] ([ProductName],[UnitPrice],[CreateDate]) VALUES ('LINQ to ADO.NET' ,10 ,'2014-01-02');
INSERT INTO [dbo].[Product] ([ProductName],[UnitPrice],[CreateDate]) VALUES ('LINQ to Entity' ,10 ,'2015-01-01');

--在SQL Server中,主键字段上默认创建聚集索引,删除主键的聚集索引。
ALTER TABLE 表名 DROP CONSTRAINT 索引名称

--重新创建主键非聚集索引.ProductID 字段
ALTER TABLE 表名 ADD CONSTRAINT 索引名称 PRIMARY KEY NONCLUSTERED (ProductID ASC)


--创建使用分区方案的聚集索引:
CREATE CLUSTERED INDEX IX_CreateDate ON 表名 ( CreateDate )
ON Scheme_DateTime ( CreateDate )


--删除(合并)一个分区表


--添加分区


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP