MS SQL Server:分區(qū)表、分區(qū)索引 詳解

十載的騰沖網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整騰沖建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“騰沖網(wǎng)站設(shè)計”,“騰沖網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
1. 分區(qū)表簡介
使用分區(qū)表的主要目的,是為了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。
? 大型表:數(shù)據(jù)量巨大的表。
? 訪問模式:因目的不同,需訪問的不同的數(shù)據(jù)行集,每種目的的訪問可以稱之為一種訪問模式。
分區(qū)一方面可以將數(shù)據(jù)分為更小、更易管理的部分,為提高性能起到一定的作用;另一方面,對于如果具有多個CPU的系統(tǒng),分區(qū)可以是對表的操作通過并行的方式進行,這對于提升性能是非常有幫助的。
注意:只能在 SQL Server Enterprise Edition 中創(chuàng)建分區(qū)函數(shù)。只有 SQL Server Enterprise Edition 支持分區(qū)。
2. 創(chuàng)建分區(qū)表或分區(qū)索引的步驟
可以分為以下步驟:
1. 確定分區(qū)列和分區(qū)數(shù)
2. 確定是否使用多個文件組
3. 創(chuàng)建分區(qū)函數(shù)
4. 創(chuàng)建分區(qū)架構(gòu)(Schema)
5. 創(chuàng)建分區(qū)表
6. 創(chuàng)建分區(qū)索引
下面詳細描述的創(chuàng)建分區(qū)表、分區(qū)索引的步驟。
2.1. 確定分區(qū)列和分區(qū)數(shù)
在開始做分區(qū)操作之前,首先要確定待分區(qū)表的訪問模式,該模式?jīng)Q定了什么列適合做分區(qū)鍵。例如,對于銷售數(shù)據(jù),一般會先根據(jù)日期把數(shù)據(jù)范圍限定在一個范圍內(nèi),然后在這個基礎(chǔ)上做進一步的查詢,這樣,就可以把日期作為分區(qū)列。
確定了分區(qū)列之后,需要進一步確定分區(qū)數(shù),亦即分區(qū)表中需要包含多少數(shù)據(jù),每個分區(qū)的數(shù)據(jù)應(yīng)該限定在哪個范圍。
2.2. 確定是否使用多個文件組
為了有助于優(yōu)化性能和維護,應(yīng)該使用文件組分離數(shù)據(jù)。一般情況下,如果經(jīng)常對分區(qū)的整個數(shù)據(jù)集操作,則文件組數(shù)最好與分區(qū)數(shù)相同,并且這些文件組通常應(yīng)該位于不同的磁盤上,再配合多個CPU,則SQL Server 可以并行處理多個分區(qū),從而大大縮短處理大量復(fù)雜報表和分析的總體時間。
2.3. 創(chuàng)建分區(qū)函數(shù)
分區(qū)函數(shù)用于定義分區(qū)的邊界條件,創(chuàng)建分區(qū)函數(shù)的語法如下:
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]
參數(shù)說明:
? partition_function_name
是分區(qū)函數(shù)的名稱。分區(qū)函數(shù)名稱在數(shù)據(jù)庫內(nèi)必須唯一,并且符合標(biāo)識符的規(guī)則。
? input_parameter_type
是用于分區(qū)的列的數(shù)據(jù)類型。當(dāng)用作分區(qū)列時,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名數(shù)據(jù)類型或 CLR 用戶定義數(shù)據(jù)類型外,所有數(shù)據(jù)類型均有效。
實際列(也稱為分區(qū)列)是在 CREATE TABLE 或 CREATE INDEX 語句中指定的。
? boundary_value
為使用 partition_function_name 的已分區(qū)表或索引的每個分區(qū)指定邊界值。如果 boundary_value 為空,則分區(qū)函數(shù)使用 partition_function_name 將整個表或索引映射到單個分區(qū)。只能使用 CREATE TABLE 或 CREATE INDEX 語句中指定的一個分區(qū)列。
boundary_value 是可以引用變量的常量表達式。這包括用戶定義類型變量,或函數(shù)以及用戶定義函數(shù)。它不能引用 Transact-SQL 表達式。boundary_value 必須與 input_parameter_type 中提供的數(shù)據(jù)類型相匹配或者可隱式轉(zhuǎn)換為該數(shù)據(jù)類型,并且如果該值的大小和小數(shù)位數(shù)與 input_parameter_type 中相應(yīng)的值的大小和小數(shù)位數(shù)不匹配,則在隱式轉(zhuǎn)換過程中該值不能被截斷。
注意:
如果 boundary_value 包含 datetime 或 smalldatetime 文字值,則為這些文字值在計算時假設(shè) us_english 是會話語言。不推薦使用此行為。要確保分區(qū)函數(shù)定義對于所有會話語言都具有預(yù)期的行為,建議使用對于所有語言設(shè)置都以相同方式進行解釋的常量,例如 yyyymmdd 格式;或者將文字值顯式轉(zhuǎn)換為特定樣式。有關(guān)詳細信息,請參閱編寫國際化 Transact-SQL 語句。若要確定服務(wù)器的語言會話,請運行 SELECT @@LANGUAGE。
? ...n
指定 boundary_value 提供的值的數(shù)目,不能超過 999。所創(chuàng)建的分區(qū)數(shù)等于 n + 1。不必按順序列出各值。如果值未按順序列出,則 Microsoft SQL Server 2005 數(shù)據(jù)庫引擎將對它們進行排序,創(chuàng)建函數(shù)并返回一個警告,說明未按順序提供值。如果 n 包括任何重復(fù)的值,則數(shù)據(jù)庫引擎將返回錯誤。
? LEFT | RIGHT
指定當(dāng)間隔值由 數(shù)據(jù)庫引擎 按升序從左到右排序時,boundary_value [ ,...n ] 屬于每個邊界值間隔的哪一側(cè)(左側(cè)還是右側(cè))。如果未指定,則默認值為 LEFT。
創(chuàng)建分區(qū)函數(shù)示例:
CREATE PARTITION FUNCTION PF_Left(int)
AS RANGE LEFT
FOR VALUES(10, 20)
GO
CREATE PARTITION FUNCTION PF_Right(int)
AS RANGE LEFT
FOR VALUES(10, 20)
GO
PF_Left 和 PF_Right 分區(qū)函數(shù)的區(qū)分:
分區(qū)函數(shù) 分區(qū)1 分區(qū)2 分區(qū)3
PF_Left = 10 10 and = 20 20
PF_Right 10 = 10 and 20 = 20
2.4. 創(chuàng)建分區(qū)架構(gòu)(Schema)
創(chuàng)建分區(qū)函數(shù)后,必須將其與分區(qū)架構(gòu)(Schema)相關(guān)聯(lián),以便將分區(qū)定向至特定的文件組。定義分區(qū)架構(gòu)師,即使多個分區(qū)位于同一個文件組中,也必須為每個分區(qū)指定一個文件組。
創(chuàng)建分區(qū)架構(gòu)的語法如下:
GOCREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
[ ; ]
參數(shù):
? partition_scheme_name
分區(qū)方案的名稱。分區(qū)方案名稱在數(shù)據(jù)庫中必須是唯一的,并且符合標(biāo)識符規(guī)則。
? partition_function_name
使用分區(qū)方案的分區(qū)函數(shù)的名稱。分區(qū)函數(shù)所創(chuàng)建的分區(qū)將映射到在分區(qū)方案中指定的文件組。partition_function_name 必須已經(jīng)存在于數(shù)據(jù)庫中。
? ALL
指定所有分區(qū)都映射到在 file_group_name 中提供的文件組,或映射到主文件組(如果指定了 [PRIMARY]。如果指定了 ALL,則只能指定一個 file_group_name。
? file_group_name | [ PRIMARY ] [ ,...n]
指定用來持有由 partition_function_name 指定的分區(qū)的文件組的名稱。file_group_name 必須已經(jīng)存在于數(shù)據(jù)庫中。
如果指定了 [PRIMARY],則分區(qū)將存儲于主文件組中。如果指定了 ALL,則只能指定一個 file_group_name。分區(qū)分配到文件組的順序是從分區(qū) 1 開始,按文件組在 [,...n] 中列出的順序進行分配。在 [,...n] 中,可以多次指定同一個 file_group_name。如果 n 不足以擁有在 partition_function_name 中指定的分區(qū)數(shù),則 CREATE PARTITION SCHEME 將失敗,并返回錯誤。
如果 partition_function_name 生成的分區(qū)數(shù)少于文件組數(shù),則第一個未分配的文件組將標(biāo)記為 NEXT USED,并且出現(xiàn)顯示命名 NEXT USED 文件組的信息。如果指定了 ALL,則單獨的 file_group_name 將為該 partition_function_name 保持它的 NEXT USED 屬性。如果在 ALTER PARTITION FUNCTION 語句中創(chuàng)建了一個分區(qū),則 NEXT USED 文件組將再接收一個分區(qū)。若要再創(chuàng)建一個未分配的文件組來擁有新的分區(qū),請使用 ALTER PARTITION SCHEME。
在 file_group_name[ 1,...n] 中指定主文件組時,必須像在 [PRIMARY] 中那樣分隔 PRIMARY,因為它是關(guān)鍵字。
創(chuàng)建分區(qū)架構(gòu)示例:
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000);
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg);
GO
2.5. 創(chuàng)建分區(qū)表
定義了分區(qū)函數(shù)(邏輯結(jié)構(gòu))和分區(qū)架構(gòu)(物理結(jié)構(gòu))后,既可以創(chuàng)建分區(qū)表來利用它們。分區(qū)表定義應(yīng)使用的分區(qū)架構(gòu),而分區(qū)架構(gòu)又定義其使用的分區(qū)函數(shù)。要將這三者結(jié)合起來,必須指定應(yīng)用于分區(qū)函數(shù)的列 。范圍分區(qū)始終只映射到表中的一列。
CREATE TABLE 語法如下:
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { column_definition | computed_column_definition }
[ table_constraint ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ ; ]
示例如下:
CREATE TABLE myRangePT1
(
ID int not null,
AGE int,
PRIMARY KEY (ID)
) ON myRangePS1(myRangePF1)
GO
2.6. 創(chuàng)建分區(qū)索引
索引對于提高查詢性能非常有效,因此,一般應(yīng)該考慮應(yīng)該考慮為分區(qū)表建立索引,為分區(qū)表建立索引與為普通表建立索引的語法一直,但是,其行為與普通索引有所差異。
默認情況下,分區(qū)表中創(chuàng)建的索引使用與分區(qū)表相同分區(qū)架構(gòu)和分區(qū)列,這樣,索引將于表對齊。將表與其索引對齊,可以使管理工作更容易進行,對于滑動窗口方案尤其如此。若要啟動分區(qū)切換,表的所有索引都必須對齊。
在創(chuàng)建索引時,也可以指定不同的分區(qū)方案(Schema)或單獨的文件組(FileGroup)來存儲索引,這樣SQL Server 不會將索引與表對齊。
在已分區(qū)的表上創(chuàng)建索引(分區(qū)索引)時,應(yīng)該注意以下事項:
? 唯一索引
建立唯一索引(聚集或者非聚集)時,分區(qū)列必須出現(xiàn)在索引列中。此限制將使SQL Server只調(diào)查單個分區(qū),并確保表中寵物的新鍵值。如果分區(qū)依據(jù)列不可能包含在唯一鍵中,則必須使用DML觸發(fā)器,而不是強制實現(xiàn)唯一性。
? 非唯一索引
對非唯一的聚集索引進行分區(qū)時,如果未在聚集鍵中明確指定分區(qū)依據(jù)列,默認情況下SQL Server 將在聚集索引列中添加分區(qū)依據(jù)列。
對非唯一的非聚集索引進行分區(qū)時,默認情況下SQL Server 將分區(qū)依據(jù)列添加為索引的包含性列,以確保索引與基表對齊,若果索引中已經(jīng)存在分區(qū)依據(jù)列,SQL Server 將不會像索引中添加分區(qū)依據(jù)列。
3. 分區(qū)操作
分區(qū)適用于可以縮放的大型表,所以隨著時間和環(huán)境的變化,就會產(chǎn)生對分區(qū)的拆分、合并、移動的需求。
3.1. 拆分與合并分區(qū)
通過拆分或合并邊界值更改分區(qū)函數(shù)。通過執(zhí)行 ALTER PARTITION FUNCTION,可以將使用分區(qū)函數(shù)的任何表或索引的某個分區(qū)拆分為兩個分區(qū),也可以將兩個分區(qū)合并為一個分區(qū)。
注意:多個表或索引可以使用同一分區(qū)函數(shù)。ALTER PARTITION FUNCTION 在單個事務(wù)中影響所有這些表或索引。
ALTER PARTITION FUNCTION 語法如下:
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
參數(shù)說明:
? partition_function_name
要修改的分區(qū)函數(shù)的名稱。
? SPLIT RANGE ( boundary_value )
在分區(qū)函數(shù)中添加一個分區(qū)。boundary_value 確定新分區(qū)的范圍,因此它必須不同于分區(qū)函數(shù)的現(xiàn)有邊界范圍。根據(jù) boundary_value,Microsoft SQL Server 2005 數(shù)據(jù)庫引擎將某個現(xiàn)有范圍拆分為兩個范圍。在這兩個范圍中,新 boundary_value 所在的范圍被視為是新分區(qū)。
重要提示:
文件組必須處于聯(lián)機狀態(tài),并且必須由使用此分區(qū)函數(shù)的分區(qū)方案標(biāo)記為 NEXT USED,以保存新分區(qū)。在 CREATE PARTITION SCHEME 語句中,將把文件組分配給分區(qū)。如果 CREATE PARTITION SCHEME 語句分配了多余的文件組(在 CREATE PARTITION FUNCTION 語句中創(chuàng)建的分區(qū)數(shù)少于用于保存它們的文件組),則存在未分配的文件組,分區(qū)方案將把其中的某個文件組標(biāo)記為 NEXT USED。該文件組將保存新的分區(qū)。如果分區(qū)方案未將任何文件組標(biāo)記為 NEXT USED,則必須使用 ALTER PARTITION SCHEME 添加一個文件組或指定一個現(xiàn)有文件組來保存新分區(qū)。可以指定已保存分區(qū)的文件組來保存附加分區(qū)。由于一個分區(qū)函數(shù)可以參與多個分區(qū)方案,因此所有使用分區(qū)函數(shù)(您向其中添加了分區(qū))的分區(qū)方案都必須擁有一個 NEXT USED 文件組。否則,ALTER PARTITION FUNCTION 將失敗并出現(xiàn)錯誤,該錯誤顯示缺少 NEXT USED 文件組的一個或多個分區(qū)方案。
? MERGE [ RANGE ( boundary_value) ]
刪除一個分區(qū)并將該分區(qū)中存在的所有值都合并到剩余的某個分區(qū)中。RANGE (boundary_value) 必須是一個現(xiàn)有邊界值,已刪除分區(qū)中的值將合并到該值中。如果最初保存 boundary_value 的文件組沒有被剩余分區(qū)使用,也沒有使用 NEXT USED 屬性進行標(biāo)記,則將從分區(qū)方案中刪除該文件組。合并的分區(qū)駐留在最初不保存 boundary_value 的文件組中。boundary_value 是一個可以引用變量(包括用戶定義類型變量)或函數(shù)(包括用戶定義函數(shù))的常量表達式。它無法引用 Transact-SQL 表達式。boundary_value 必須匹配或可以隱式轉(zhuǎn)換為其對應(yīng)列的數(shù)據(jù)類型,并且當(dāng)值的大小和小數(shù)位數(shù)不匹配其對應(yīng) input_parameter_type 時,將無法在隱式轉(zhuǎn)換過程中被截斷。
本文是我關(guān)于數(shù)據(jù)庫分區(qū)的方案的一些想法,或許有些問題。僅供大家討論。SqlServer (SqlServer 2005\SqlServer 2008)實現(xiàn)分區(qū)需要在企業(yè)版下進行.
SqlServer的分區(qū)分為大致有以下個過程:1、創(chuàng)建文件組用以存放數(shù)據(jù)文件 2、創(chuàng)建文件組用戶數(shù)據(jù)文件 3、創(chuàng)建分區(qū)函數(shù) 4、創(chuàng)建分區(qū)方案 5、在分區(qū)方案下創(chuàng)建表
本文是在SqlServer2012 下完成的。
1.日期列用的是varchar類型可以不改成date類型。但一般建議用日期型。
2.switch到普通表是ddl動作,秒級速度。不受索引影響。
3.切換歷史數(shù)據(jù)到普通表后,再通過bcq導(dǎo)出普通表即可。導(dǎo)入備庫用bulk insert即可。
SQLSERVER中,有時需要知道已經(jīng)建了哪些分區(qū)表,從哪里看?
1、直接用SQL語句查:
--分區(qū)數(shù)大于1的,就是我們想查看的分區(qū)表:
SELECT p.*,'|' AS SP ,t.* FROM sys.partitions AS p
inner JOIN sys.tables AS t ON p.object_id = t.object_id
inner join (
select object_id as object_id2,index_id, count(*) AS CNT FROM sys.partitions
group by object_id,index_id
having count(*)1
) s on s.object_id2 = p.object_id
WHERE p.partition_id IS NOT NULL
order by t.name;
2、在管理器中查看:
Databases [數(shù)據(jù)庫名稱] 節(jié)點 存儲(Storage) 節(jié)點
\ 分區(qū)架構(gòu)(Partition Schemes ) 節(jié)點 選中一項 右鍵 查看依賴
\ 分區(qū)函數(shù)(Partition Functions ) 節(jié)點 選中一項 右鍵 生成腳本
3、有作多分區(qū)的表,屬性的 存儲(Storage) 會有 Partitioning 信息。
創(chuàng)建一個分區(qū)表首先要定義你用來映射表內(nèi)分區(qū)的分區(qū)函數(shù)。在下面定義的分區(qū)函數(shù)中,我將使用三個分區(qū),每個分區(qū)對應(yīng)于SalesHistoryArchive表中的每一種產(chǎn)品類型,這個表將在稍后定義。基本上,這些分區(qū)會把SalesHistoryArchive檔案表劃分成三個不同的表,它們由SQL Server自動維護。CREATE PARTITION FUNCTION [pf_Product_Partition](VARCHAR(10)) AS RANGE LEFTFOR VALUES (N'BigScreen', N'Computer', N'PoolTable')定義函數(shù)的范圍決定分區(qū)值屬于哪一個邊界。RNAGE LEFT:指定分區(qū)值將小于或等于在分區(qū)函數(shù)中定義的值。在上面使用的分區(qū)函數(shù)中一共建立了四個分區(qū)。
網(wǎng)頁名稱:sqlserver列分區(qū),sqlserver表分區(qū)
本文地址:http://chinadenli.net/article19/dsspjgh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站設(shè)計、、網(wǎng)站營銷、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)