SQL Server表分區

SQL Server表分區

什么是表分區

一般情況下,我們建立數據庫表時,表數據都存放在一個文件里。

但是如果是分區表的話,表數據就會按照你指定的規則分放到不同的文件里,把一個大的數據文件拆分為多個小文件,還可以把這些小文件放在不同的磁盤下由多個cpu進行處理。這樣文件的大小隨著拆分而減小,還得到硬件系統的加強,自然對我們操作數據是大大有利的。

所以大數據量的數據表,對分區的需要還是必要的,因為它可以提高select效率,還可以對歷史數據經行區分存檔等。但是數據量少的數據就不要湊這個熱鬧啦,因為表分區會對數據庫產生不必要的開銷,除啦性能還會增加實現對象的管理費用和復雜性。

跟著做,分區如此簡單

先跟著做一個分區表(分為11個分區),去除神秘的面紗,然后咱們再逐一擊破各個要點要害。

分區是要把一個表數據拆分為若干子集合,也就是把把一個數據文件拆分到多個數據文件中,然而這些文件的存放可以依托一個文件組或這多個文件組,由于多個文件組可以提高數據庫的訪問并發量,還可以把不同的分區配置到不同的磁盤中提高效率,所以創建時建議分區跟文件組個數相同。

1.創建文件組

可以點擊數據庫屬性在文件組里面添加

T-sql語法:

alter database <數據庫名> add filegroup <文件組名>
---創建數據庫文件組
alter database testSplit add filegroup ByIdGroup1
alter database testSplit add filegroup ByIdGroup2
alter database testSplit add filegroup ByIdGroup3
alter database testSplit add filegroup ByIdGroup4
alter database testSplit add filegroup ByIdGroup5
alter database testSplit add filegroup ByIdGroup6
alter database testSplit add filegroup ByIdGroup7
alter database testSplit add filegroup ByIdGroup8
alter database testSplit add filegroup ByIdGroup9
alter database testSplit add filegroup ByIdGroup10

?

2.創建數據文件到文件組里面

可以點擊數據庫屬性在文件里面添加

T-sql語法:

alter database <數據庫名稱> add file <數據標識> to filegroup <文件組名稱>--<數據標識> (name:文件名,fliename:物理路徑文件名,size:文件初始大小kb/mb/gb/tb,filegrowth:文件自動增量kb/mb/gb/tb/%,maxsize:文件可以增加到的最大大小kb/mb/gb/tb/unlimited)
alter database testSplit add file 
(name=N'ById1',filename=N'J:\Work\數據庫\data\ById1.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup1
alter database testSplit add file 
(name=N'ById2',filename=N'J:\Work\數據庫\data\ById2.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup2
alter database testSplit add file 
(name=N'ById3',filename=N'J:\Work\數據庫\data\ById3.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup3
alter database testSplit add file 
(name=N'ById4',filename=N'J:\Work\數據庫\data\ById4.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup4
alter database testSplit add file 
(name=N'ById5',filename=N'J:\Work\數據庫\data\ById5.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup5
alter database testSplit add file 
(name=N'ById6',filename=N'J:\Work\數據庫\data\ById6.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup6
alter database testSplit add file 
(name=N'ById7',filename=N'J:\Work\數據庫\data\ById7.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup7
alter database testSplit add file 
(name=N'ById8',filename=N'J:\Work\數據庫\data\ById8.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup8
alter database testSplit add file 
(name=N'ById9',filename=N'J:\Work\數據庫\data\ById9.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup9
alter database testSplit add file 
(name=N'ById10',filename=N'J:\Work\數據庫\data\ById10.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup10

?

執行完成后,右鍵數據庫看文件組跟文件里面是不是多出來啦這些文件組跟文件。

3.使用向導創建分區表

右鍵到要分區的表--- >> 存儲 --- >> 創建分區?--- >>顯示向導視圖?--- >> 下一步?--- >> 下一步。。

這里舉例說下選擇列的意思:

假如你選擇的是int類型的列:那么你的分區可以指定為1--100W是一個分區,100W--200W是一個分區....

假如你選擇的是datatime類型:那么你的分區可以指定為:2014-01-01--2014-01-31一個分區,2014-02-01--2014-02-28一個分區...

根據這樣的列數據規則劃分,那么在那個區間的數據,在插入數據庫時就被指向那個分區存儲下來。

?

我這里選用orderid int類型 --- >>?下一步?--- >>

左邊界右邊界:就是把臨界值劃分給上一個分區還是下一個分區。一個小于號,一個小于等于號。

然后下一步下一步最后你會得到分區函數和分區方案。

?

USE [testSplit]
GO
BEGIN TRANSACTION--創建分區函數
CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N'1000000', N'2000000', N'3000000', N'4000000', N'5000000', N'6000000', N'7000000', N'8000000', N'9000000', N'10000000')--創建分區方案
CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([PRIMARY], [ByIdGroup1], [ByIdGroup2], [ByIdGroup3], [ByIdGroup4], [ByIdGroup5], [ByIdGroup6], [ByIdGroup7], [ByIdGroup8], [ByIdGroup9], [ByIdGroup10])--創建分區索引
CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] 
([OrderId]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [bgPartitionSchema]([OrderId])--刪除分區索引
DROP INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] WITH ( ONLINE = OFF )COMMIT TRANSACTION

?

執行上面向導生成的語句。分區完成。。

4.秀一下速度。

首先我在表中插入啦1千萬行數據。給表分啦11個分區。前十個分區里面一個是100W條數據。。

說兩句:

可見反常現象,掃描次數跟邏輯讀取次數都是無分區表的2倍之多,但查詢速度卻是快啦不少啊。這就是分區的神奇之處啊,所以要相信這世界一切皆有可能。

分區函數,分區方案,分區表,分區索引

1.分區函數

指定分依據區列(依據列唯一),分區數據范圍規則,分區數量,然后將數據映射到一組分區上。

創建語法:?

create partition function 分區函數名(<分區列類型>) as range [left/right] 
for values (每個分區的邊界值,....)?
--創建分區函數
CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N'1000000', N'2000000', N'3000000', N'4000000', N'5000000', N'6000000', N'7000000', N'8000000', N'9000000', N'10000000')

然而,分區函數只定義了分區的方法,此方法具體用在哪個表的那一列上,則需要在創建表或索引是指定。?

刪除語法:

--刪除分區語法
drop partition function <分區函數名>
--刪除分區函數 bgPartitionFun
drop partition function bgPartitionFun

需要注意的是,只有沒有應用到分區方案中的分區函數才能被刪除。

2.分區方案

指定分區對應的文件組。

創建語法:?

--創建分區方案語法
create partition scheme <分區方案名稱> as partition <分區函數名稱> [all]to (文件組名稱,....)?
--創建分區方案,所有分區在一個組里面
CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1])

分區函數必須關聯分區方案才能有效,然而分區方案指定的文件組數量必須與分區數量一致,哪怕多個分區存放在一個文件組中。

刪除語法:

--刪除分區方案語法
drop partition scheme<分區方案名稱>
--刪除分區方案 bgPartitionSchema
drop partition scheme bgPartitionSchema1

只有沒有分區表,或索引使用該分區方案是,才能對其刪除。

3.分區表

創建語法:

--創建分區表語法
create table <表名> (<列定義>
)on<分區方案名>(分區列名)
--創建分區表
create table BigOrder (OrderId              int                  identity,orderNum             varchar(30)          not null,OrderStatus          int                  not null default 0,OrderPayStatus       int                  not null default 0,UserId               varchar(40)          not null,CreateDate           datetime             null default getdate(),Mark                 nvarchar(300)        null
)on bgPartitionSchema(OrderId)

?

如果在表中創建主鍵或唯一索引,則分區依據列必須為該列。

4.分區索引

創建語法:?

--創建分區索引語法
create <索引分類> index <索引名稱> 
on <表名>(列名)
on <分區方案名>(分區依據列名)
--創建分區索引
CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] 
([OrderId]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [bgPartitionSchema]([OrderId])

使用分區索引查詢,可以避免多個cpu操作多個磁盤時產生的沖突。

分區表明細信息

這里的語法,我就不寫啦,自己看語句分析吧。簡單的很。。

1.查看分區依據列的指定值所在的分區?

--查詢分區依據列為10000014的數據在哪個分區上
select $partition.bgPartitionFun(2000000)  --返回值是2,表示此值存在第2個分區?

2.查看分區表中,每個非空分區存在的行數

--查看分區表中,每個非空分區存在的行數
select $partition.bgPartitionFun(orderid) as partitionNum,count(*) as recordCount
from bigorder
group by  $partition.bgPartitionFun(orderid)

3.查看指定分區中的數據記錄?

---查看指定分區中的數據記錄
select * from bigorder where $partition.bgPartitionFun(orderid)=2

結果:數據從1000001開始到200W結束

分區的拆分與合并以及數據移動

?1.拆分分區

在分區函數中新增一個邊界值,即可將一個分區變為2個。

--分區拆分
alter partition function bgPartitionFun()
split range(N'1500000')  --將第二個分區拆為2個分區

注意:如果分區函數已經指定了分區方案,則分區數需要和分區方案中指定的文件組個數保持對應一致。

?2.合并分區

?與拆分分區相反,去除一個邊界值即可。

--合并分區
alter partition function bgPartitionFun()
merge range(N'1500000')  --將第二第三分區合并

3.分區中的數據移動

?你或許會遇到這樣的需求,將普通表數據復制到分區表中,或者將分區表中的數據復制到普通表中。

?那么移動數據這兩個表,則必須滿足下面的要求。

  • 字段數量相同,對應位置的字段相同
  • 相同位置的字段要有相同的屬性,相同的類型。
  • 兩個表在一個文件組中

1.創建表時指定文件組

--創建表
create table <表名> (<列定義>
)on <文件組名>

2.從分區表中復制數據到普通表

--將bigorder分區表中的第一分區數據復制到普通表中
alter table bigorder switch partition 1 to <普通表名>

3.從普通標中復制數據到分區表中

這里要注意的是要先將分區表中的索引刪除,即便普通表中存在跟分區表中相同的索引。

--將普通表中的數據復制到bigorder分區表中的第一分區
alter table <普通表名> switch to bigorder partition 1

分區視圖

分區視圖是先建立帶有字段約束的相同表,而約束不同,例如,第一個表的id約束為0--100W,第二表為101萬到200萬.....依次類推。

創建完一系列的表之后,用union all 連接起來創建一個視圖,這個視圖就形成啦分區視同。

很簡單的,這里我主要是說分區表,就不說分區視圖啦。。

?查看數據庫分區信息

?

SELECT OBJECT_NAME(p.object_id) AS ObjectName,i.name                   AS IndexName,p.index_id               AS IndexID,ds.name                  AS PartitionScheme,   p.partition_number       AS PartitionNumber,fg.name                  AS FileGroupName,prv_left.value           AS LowerBoundaryValue,prv_right.value          AS UpperBoundaryValue,CASE pf.boundary_value_on_rightWHEN 1 THEN 'RIGHT'ELSE 'LEFT' END    AS Range,p.rows AS Rows
FROM sys.partitions                  AS p
JOIN sys.indexes                     AS iON i.object_id = p.object_idAND i.index_id = p.index_id
JOIN sys.data_spaces                 AS dsON ds.data_space_id = i.data_space_id
JOIN sys.partition_schemes           AS psON ps.data_space_id = ds.data_space_id
JOIN sys.partition_functions         AS pfON pf.function_id = ps.function_id
JOIN sys.destination_data_spaces     AS dds2ON dds2.partition_scheme_id = ps.data_space_id AND dds2.destination_id = p.partition_number
JOIN sys.filegroups                  AS fgON fg.data_space_id = dds2.data_space_id
LEFT JOIN sys.partition_range_values AS prv_leftON ps.function_id = prv_left.function_idAND prv_left.boundary_id = p.partition_number - 1
LEFT JOIN sys.partition_range_values AS prv_rightON ps.function_id = prv_right.function_idAND prv_right.boundary_id = p.partition_number 
WHEREOBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
UNION ALL
SELECTOBJECT_NAME(p.object_id)    AS ObjectName,i.name                      AS IndexName,p.index_id                  AS IndexID,NULL                        AS PartitionScheme,p.partition_number          AS PartitionNumber,fg.name                     AS FileGroupName,  NULL                        AS LowerBoundaryValue,NULL                        AS UpperBoundaryValue,NULL                        AS Boundary, p.rows                      AS Rows
FROM sys.partitions     AS p
JOIN sys.indexes        AS iON i.object_id = p.object_idAND i.index_id = p.index_id
JOIN sys.data_spaces    AS dsON ds.data_space_id = i.data_space_id
JOIN sys.filegroups           AS fgON fg.data_space_id = i.data_space_id
WHEREOBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
ORDER BYObjectName,IndexID,PartitionNumber

?

轉自:https://www.cnblogs.com/knowledgesea/p/3696912.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

apt 根據注解,編譯時生成代碼

apt&#xff1a; Retention后面的值&#xff0c;設置的為CLASS&#xff0c;說明就是編譯時動態處理的。一般這類注解會在編譯的時候&#xff0c;根據注解標識&#xff0c;動態生成一些類或者生成一些xml都可以&#xff0c;在運行時期&#xff0c;這類注解是沒有的~~會依靠動態生…

Web.config配置文件詳解(新手必看)

花了點時間整理了一下ASP.NET Web.config配置文件的基本使用方法。很適合新手參看&#xff0c;由于Web.config在使用很靈活&#xff0c;可以自定義一些節點。所以這里只介紹一些比較常用的節點。 <?xml version"1.0"?> <!--注意: 除了手動編輯此文件以外&…

Hello Playwright:(6)與元素交互

在上一節我們已經了解到如何定位到元素&#xff0c;那么接下來就可以與元素進行交互了。下面的例子都是以百度首頁作為測試頁面輸入文本FillAsync方法用于模擬用戶選中元素并輸入文本&#xff0c;這會觸發元素的 input 事件。該方法只適合<input>、<textarea>等可輸…

C語言試題四十六之將m行n列的二維數組中的字符數據,按列的順序依次放到一個字符串中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

【MATLAB統計分析與應用100例】案例007:matlab數據的極差歸一化變換

文章目錄 1. 調用rand函數產生一個10行,4列的隨機矩陣,每列服從不同的均勻分布2. 調用rscore函數對x按列進行極差規格化變換, 返回變換后矩陣R,以及矩陣x各列的最小值構成的向量xmin,各列的極差構成的向量xrange1. 調用rand函數產生一個10行,4列的隨機矩陣,每列服從不同…

十二、動態座位響應及用戶訂票《仿淘票票系統前后端完全制作(除支付外)》

一、動態座位設置及發布 首先打開在線編輯器進入我們的項目&#xff1a;https://editor.ivx.cn/ 上一節中已經完成了座位設置的準備&#xff0c;這一節咱們將完成座位設置及發布的功能。 咱們首先給有座位設置事件&#xff1a; 有座位的事件設置當點擊后更改當前的內容為0即…

跨服務器 快速 導入數據表記錄 Insert into SELECT

Use DataBaseName/*開啟Ad Hoc Distributed Queries組件exec sp_configure show advanced options,1 reconfigure exec sp_configure Ad Hoc Distributed Queries,1 reconfigure*/Insert into tableName (col1&#xff0c;col2&#xff0c;col3&#xff0c;……) --字段不能含有…

C# 查詢大型數據集

LINQ 語法非常好&#xff0c;但其作用是什么&#xff1f;我們只要查看源數組&#xff0c;就可以看出需要的結果&#xff0c;為什么要查詢這種一眼就能看出結果的數據源呢&#xff1f;有時查詢的結果不那么明顯&#xff0c;在下面的示例中&#xff0c;就創建了一個非常大的數字數…

C語言試題四十七之程序定義了N×M的二維數組,并在主函數中自動賦值。請編寫函數function(int a[N][M], int m),該函數的功能是:將數組右上半三角元素中的值乘以m。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 程序定義了…

第六章 三大消息摘要算法總結

6.1、MD5 推薦使用CC&#xff08;即Commons Codec&#xff09;實現雖然已被破解&#xff0c;但是仍舊廣泛用于注冊登錄模塊與驗證下載的文件的完整性可以自己寫一個注冊登錄模塊&#xff1b;自己下載一個MD5加密的文件&#xff0c;然后通過之前編寫的工具類&#xff08;或者使用…

一、博客首頁搭建搭建《iVX低代碼仿CSDN個人博客制作》

制作iVX 低代碼項目需要進入在線IDE&#xff1a;https://editor.ivx.cn/ 一、頭部導航欄思路參考 首先我們可以查看CSDN的博客首頁&#xff0c;從中查看一下布局&#xff1a; 在以上首頁中&#xff0c;我們可以得知其頂部為一個整行&#xff0c;這個行內容左側為一個logo&am…

【MATLAB統計分析與應用100例】案例008:調用rand函數生成均勻分布隨機數

文章目錄 1. 生成隨機數分布直方圖2. 生成隨機數矩陣,服從均勻分布1. 生成隨機數分布直方圖 x = rand(10) % 生成10行10列的隨機數矩陣,其元素服從[0,1]上均勻分布 y = x(:)

linux samba服務器

本文轉自wanglm51051CTO博客&#xff0c;原文鏈接&#xff1a; http://blog.51cto.com/studyit2016/1890282&#xff0c;如需轉載請自行聯系原作者

modernizer的意義

modernizer是一個js文件&#xff0c;會檢查當前的瀏覽器支持什么特性&#xff0c;就在Html標簽上添加什么類&#xff0c;然后如果不支持添加no-xxx類&#xff0c;這樣&#xff0c;就可以針對兩種情況寫兩種css。 http://blog.chinaunix.net/uid-21633169-id-4286857.html轉載于…

拆分備份(還原)比較大的數據庫為多個bak文件

工作中由于個別數據庫比較大&#xff0c;生成的備份文件也比較大&#xff0c;不方便存儲或者轉移&#xff0c;可以將文件備份為多個小的bak文件。 比如一個200G的數據庫&#xff0c;可以拆分備份為10個bak文件&#xff0c;則每個bak文件約在20G左右。 備份代碼&#xff1a; /…

C語言試題四十八之該函數可以統計一個長度為2的字符串在另一個字符串中出現的次數。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫一個…

Rafy 框架 - 幽靈插件(假刪除)

Rafy 框架又添新成員&#xff1a;幽靈插件。本文將解釋該插件的場景、使用方法、原理。 場景 在開發各類數據庫應用系統時&#xff0c;往往需要在刪除數據時不是真正地刪除數據&#xff0c;而只是把數據標識為‘已刪除’狀態。這些數據在業務邏輯上是已經完全刪除、不可用的數據…

C#-Linq源碼解析之Average

前言在Dotnet開發過程中&#xff0c;Average作為IEnumerable的擴展方法&#xff0c;十分常用。本文對Average方法的關鍵源碼進行簡要分析&#xff0c;以方便大家日后更好的使用該方法。使用Average 計算數值序列的平均值假如我們有這樣的一個集合List<int> grades new L…

二、博客首頁完成《iVX低代碼仿CSDN個人博客制作》

制作iVX 低代碼項目需要進入在線IDE&#xff1a;https://editor.ivx.cn/ 一、菜單思路參考及制作 在 CSDN 首頁中的菜單部分為一串橫排的內容&#xff0c;并且可以進行拖動&#xff1a; 首先咱們添加一個行&#xff0c;命名為菜單&#xff1a; 接著肯定是需要設置上下的內邊…

【MATLAB統計分析與應用100例】案例009:創建一個RandStream類對象,調用其randn方法生成標準正態分布隨機數

文章目錄 1. 創建一個RandStream類對象s,其隨機數生成器的算法為mlfg6331_64,初始種子為102. 調用對象s的randn方法生成10行10列的隨機數矩陣x,其元素服從標準正態分布1. 創建一個RandStream類對象s,其隨機數生成器的算法為’mlfg6331_64’,初始種子為10 % 對象s的randn方…