SQL Server中怎么实现表分区

首先打开sqlserver工具,然后新建一个数据库如图:

写完数据库名称后先不要确认,在左侧选项中选择文件组。给数据库添加一些文件组,如图:

我这里按今年月份,每个月新建一个文件组。然后点击确定。

数据库创建好以后找到我们的数据库,点击右键选择属性。然后打开文件组可以看到我们刚刚新建的文件组都在里面。

然后选择文件选项里我们添加一些数据库的文件,这些数据库文件就是以后我们要把数据存储到文件里的。

如图:

注意多了一行,数据库文件名称安装每个月来取的,然后选择文件组,选择以后这个文件放到哪个文件组下。选择好后再给文件取个名字。然后刚刚写了几个文件组那么就写几个数据库文件,对应上。如下:

点击确认。

下一步创建分区函数代码如下:

--创建分区函数
CREATE PARTITION FUNCTION Function_DateTime ( DATETIME )
AS RANGE RIGHT
FOR VALUES('2018-08-02', '2018-09-02', '2018-10-02', '2018-11-02', '2018-12-02')

每个月写一个日期。创建完成后可以用sql查询下有没有创建成功代码:

--查询分区函数
SELECT * FROM sys.partition_functions

接着再创建分区方案代码如下:

--创建分区方案,将文件跟分区绑定
CREATE PARTITION SCHEME Scheme_DateTime
AS PARTITION Function_DateTime 
TO ([PRIMARY], MyDB201808, MyDB201809, MyDB201810, MyDB201811,MyDB201812 )

这步操作是将文件跟分区绑定在一起,创建完成后查询一下:

--查询分区方案
SELECT * FROM sys.partition_schemes

如果不想写查询语句的话可以在工具中查看,如图:

可以看到,分区函数和分区方案都在这里。

下一步就是创建分区表了,就是我们的表结构:

--创建分区表
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 )

注意最后一行,要吧OrderDate放到分区方案中,以为我们的数据按日期存储到各个文件中的。

然后添加一些数据:

INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,10.00 ,'2018-08-12');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,20.50 ,'2018-08-21');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (2 ,40.00 ,'2018-08-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (3 ,40.00 ,'2018-09-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (4 ,50.00 ,'2018-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2018-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2018-11-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (6 ,70.00 ,'2018-11-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (10 ,90.00 ,'2018-12-21');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (9 ,100.00 ,'2018-12-20');
GO

添加完数据后我们可以来查看下每个分区中的数据个数:

--查询个分区表中数据
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 * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 4
SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 5

之前我们创建了5个分区,然后根据上面代码执行后可以看到每个分区的数据,运行结果如下:

这说明我们把输入已经按日期插入到各个分区中了。

全部SQL 代码:

--创建分区函数
CREATE PARTITION FUNCTION Function_DateTime ( DATETIME )
AS RANGE RIGHT
FOR VALUES('2018-08-02', '2018-09-02', '2018-10-02', '2018-11-02', '2018-12-02')

--查询分区函数
SELECT * FROM sys.partition_functions

--创建分区方案,将文件跟分区绑定
CREATE PARTITION SCHEME Scheme_DateTime
AS PARTITION Function_DateTime 
TO ([PRIMARY], MyDB201808, MyDB201809, MyDB201810, MyDB201811,MyDB201812 )

--查询分区方案
SELECT * FROM sys.partition_schemes

--创建分区表
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 )

INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,10.00 ,'2018-08-12');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,20.50 ,'2018-08-21');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (2 ,40.00 ,'2018-08-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (3 ,40.00 ,'2018-09-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (4 ,50.00 ,'2018-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2018-10-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2018-11-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (6 ,70.00 ,'2018-11-20');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (10 ,90.00 ,'2018-12-21');
INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (9 ,100.00 ,'2018-12-20');
GO

--查询个分区表中数据
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 * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 4
SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 5

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值