SQL脚本整理系列一 表分区

表分区的目的:

1.把历史数据放到另外一个表里面 可以提高查询效率 当然如果经常查询历史数据和新数据的合并结果集这样做就大大的不好了

2.通过把一个表放到不同的文件,不同的文件再存储到不同的磁盘列阵中,可以提高IO速度   CPU比硬盘快多了

3.提高可用性,一个磁盘坏了,另外一个磁盘上面的文件还能用 这个对我意义不大

4.便于备份 只需要做一个分区的备份就可以了,比如云服务端,数据量比较大的就4个表单,把这四个表放在一个文件里面这样每天备份基本不花什么时间,还原也比较方便,这4个表的数据丢了意义也不大, 没有做测试

 

   分区表的定义大体上分为三个步骤:

  1.     定义分区函数
  2.     定义分区构架
  3.     定义分区表 插入测试数据
  4. 【把一个表的数据导入到另外一个表中 这个速度挺快的】

--创建数据库 这些操作可以在图形界面完成
--因为在自己电脑上面测试 所以都放在同一个硬盘上面了  http://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html

技术分享
CREATE  database  Sales on primary
(
   name=NSales,
   filename=NG:\data\Primary\Sales.mdf,
   size=3MB,
   maxsize=100MB,
   filegrowth=10%
),--创建文件组
filegroup FG1
(
  NAME = NFile1,   
  FILENAME = NG:\data\FG1\File1.ndf,   
  SIZE = 1MB,   
  MAXSIZE = 100MB,   
  FILEGROWTH = 10% 
),--创建文件组
FILEGROUP FG2   
(   
  NAME = NFile2,   
  FILENAME = NG:\data\FG2\File2.ndf,   
  SIZE = 1MB,   
  MAXSIZE = 100MB,
  FILEGROWTH = 10%   
),--创建文件组
FILEGROUP FG3   
(   
  NAME = NFile3,   
  FILENAME = NG:\data\FG3\File3.ndf,   
  SIZE = 1MB,   
  MAXSIZE = 100MB,   
  FILEGROWTH = 10%   
)   
LOG ON   
(   
  NAME = NSales_Log,   
  FILENAME = NG:\data\Primary\Sales_Log.ldf,   
  SIZE = 1MB,   
  MAXSIZE = 100MB,   
  FILEGROWTH = 10%
)
GO
View Code

--创建分区函数

技术分享
USE Sales   
GO
CREATE PARTITION FUNCTION pf_OrderDate (datetime)   
AS RANGE RIGHT  --以后默认就写Right 不要记混了 
FOR VALUES (2003/01/01, 2004/01/01) 
GO
View Code

--建立分区架构 比如把1900-01-01-‘2003/01/01‘之间的数据存储到FG2里面
-- ‘2003/01/01‘- ‘2004/01/01‘之间的数据也存储到FG2里面
-- ‘2004/01/01‘-  之间的数据也存储到FG3里面

技术分享
--建立分区架构 比如把1900-01-01-‘2003/01/01‘之间的数据存储到FG2里面
-- ‘2003/01/01‘- ‘2004/01/01‘之间的数据也存储到FG2里面
-- ‘2004/01/01‘-  之间的数据也存储到FG3里面
Use Sales
go
create  partition  scheme ps_OrderDate
as partition  pf_OrderDate
to(FG2,FG2,FG3)
go
View Code

--建立表

技术分享
--建立表
Use Sales
go
create table Orders --订单表
(
   OrderID int identity(10000,1),
   OrderDate datetime  not null,
   CustomerID int not null,
   constraint  PK_Orders primary key(OrderID,OrderDate)
)
on ps_OrderDate(OrderDate) -- 这句话决定这个表的不同之处
go
create table OrdersHistory --订单历史表 可以把不常用的数据放到这个表里面 
--这样对于Orders的查询就会大大提高 有必要的时候再通过Union All 查询所有数据
(
   OrderID int identity(10000,1),
   OrderDate datetime  not null,
   CustomerID int not null,
   constraint  PK_OrdersHistory primary key(OrderID,OrderDate)
)
on ps_OrderDate(OrderDate)
go
View Code

--向表中插入数据

技术分享
--向表中插入数据
USE Sales   
GO   
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2002/6/25, 1000)   
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2002/8/13, 1000)   
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2002/8/25, 1000)   
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2002/9/23, 1000)
GO 1000

USE Sales   
GO
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2003/6/25, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2003/8/13, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2003/8/25, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2003/9/23, 1000)   
GO 1000

GO
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2006/6/25, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2007/8/13, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2008/8/25, 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES (2009/9/23, 1000)   
GO 11000
View Code

--查看结果

技术分享
SELECT * FROM Orders
SELECT * FROM dbo.OrdersHistory

--查看各个分区的数据行数
select $partition.pf_OrderDate(OrderDate) as Patition,COUNT(*) countRow from dbo.Orders
group by $partition.pf_OrderDate(OrderDate)

--检验分区函数
SELECT  $partition.pf_OrderDate(2002) AS 所在分区
UNION ALL 
SELECT  $partition.pf_OrderDate(2003) AS 所在分区
UNION ALL 
SELECT  $partition.pf_OrderDate(2004) AS 所在分区
View Code

--把第二部分的数据转存到历史表中

技术分享
--把第二部分的数据转存到历史表中
Use Sales
go
alter table orders switch partition 2 to ordersHistory partition 2
go
View Code

--查看结果

技术分享
--查看结果
SELECT * FROM Orders 
SELECT * FROM dbo.OrdersHistory
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。