表分區的目的:
1.把歷史數據放到另外一個表里面 可以提高查詢效率 當然如果經常查詢歷史數據和新數據的合并結果集這樣做就大大的不好了
2.通過把一個表放到不同的文件,不同的文件再存儲到不同的磁盤列陣中,可以提高IO速度?? CPU比硬盤快多了
3.提高可用性,一個磁盤壞了,另外一個磁盤上面的文件還能用 這個對我意義不大
4.便于備份 只需要做一個分區的備份就可以了,比如云服務端,數據量比較大的就4個表單,把這四個表放在一個文件里面這樣每天備份基本不花什么時間,還原也比較方便,這4個表的數據丟了意義也不大, 沒有做測試
?
?? 分區表的定義大體上分為三個步驟:
- ??? 定義分區函數
- ??? 定義分區構架
- ??? 定義分區表 插入測試數據
- 【把一個表的數據導入到另外一個表中 這個速度挺快的】
--創建數據庫 這些操作可以在圖形界面完成
--因為在自己電腦上面測試 所以都放在同一個硬盤上面了?
http://www.cnblogs.com/CareySon/archive/2011/12/30/2307766.html
CREATE
database
Sales
on
primary
(
name
=
N
'
Sales
'
,
filename
=
N
'
G:\data\Primary\Sales.mdf
'
,
size
=
3MB,
maxsize
=
100MB,
filegrowth
=
10
%
),
--
創建文件組
filegroup FG1
(
NAME
=
N
'
File1
'
,
FILENAME
=
N
'
G:\data\FG1\File1.ndf
'
,
SIZE
=
1MB,
MAXSIZE
=
100MB,
FILEGROWTH
=
10
%
),
--
創建文件組
FILEGROUP FG2
(
NAME
=
N
'
File2
'
,
FILENAME
=
N
'
G:\data\FG2\File2.ndf
'
,
SIZE
=
1MB,
MAXSIZE
=
100MB,
FILEGROWTH
=
10
%
),
--
創建文件組
FILEGROUP FG3
(
NAME
=
N
'
File3
'
,
FILENAME
=
N
'
G:\data\FG3\File3.ndf
'
,
SIZE
=
1MB,
MAXSIZE
=
100MB,
FILEGROWTH
=
10
%
)
LOG
ON
(
NAME
=
N
'
Sales_Log
'
,
FILENAME
=
N
'
G:\data\Primary\Sales_Log.ldf
'
,
SIZE
=
1MB,
MAXSIZE
=
100MB,
FILEGROWTH
=
10
%
)
GO
--創建分區函數
USE
Sales
GO
CREATE
PARTITION
FUNCTION
pf_OrderDate (
datetime
)
AS
RANGE
RIGHT
--
以后默認就寫Right 不要記混了
FOR
VALUES
(
'
2003/01/01
'
,
'
2004/01/01
'
)
GO
--建立分區架構 比如把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
--建立表
--
建立表
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
--向表中插入數據
--
向表中插入數據
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
--查看結果
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
'
所在分區
'
--把第二部分的數據轉存到歷史表中 把分區移動到不同的表,效率比較高消耗時間比較少
--目標分區只能是空的;必須都存在;
--必須在同一個文件組內,分區號必須相同(是指兩個表公用同一個分區函數的情況下,不共用分區函數就沒有范圍限制了 )
--
把第二部分的數據轉存到歷史表中
Use
Sales
go
alter
table
orders switch partition
2
to
ordersHistory partition
2
go
--查看結果
--
查看結果
SELECT
*
FROM
Orders
SELECT
*
FROM
dbo.OrdersHistory
?--創建一個新分區
--
創建一個新分區
ALTER
PARTITION SCHEME ps_OrderDate
NEXT
USED FG3
ALTER
PARTITION
FUNCTION
pf_OrderDate()
SPLIT RANGE (
'
2007/01/01
'
)
--
檢查效果
INSERT
INTO
dbo.Orders (OrderDate, CustomerID)
VALUES
(
'
2009/9/23
'
,
1000
)
GO
9
--
查看各個分區的數據行數
select
$partition.pf_OrderDate(OrderDate)
as
Patition,
COUNT
(
*
) countRow
from
dbo.Orders
group
by
$partition.pf_OrderDate(OrderDate)
--刪除一個分區
--
移除分區
ALTER
PARTITION
FUNCTION
pf_OrderDate()
MERGE RANGE (
'
2004/01/01
'
)
--檢查移除效果
--
檢查移除效果
SELECT
$partition.pf_OrderDate(
'
2002
'
)
AS
'
所在分區
'
UNION
ALL
SELECT
$partition.pf_OrderDate(
'
2003
'
)
AS
'
所在分區
'
UNION
ALL
SELECT
$partition.pf_OrderDate(
'
2004
'
)
AS
'
所在分區
'
UNION
ALL
SELECT
$partition.pf_OrderDate(
'
2008
'
)
AS
'
所在分區
'
-- 移除分區函數 分區方案
a。刪除源表 再刪除分區函數 分區方案
truncate table name1
drop table name1
DROP
PARTITION SCHEME name1
DROP
PARTITION
FUNCTION
name1
b。如果是沒有聚集索引的表
可以通過重新建立索引而不引用分區方案的方式來
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

