當前位置:首頁 » 編程語言 » sqlserver數據表分區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver數據表分區

發布時間: 2023-08-19 10:35:28

A. 怎麼修改sqlserver分區方案

創建一個分區表首先要定義你用來映射表內分區的分區函數。在下面定義的分區函數中,我將使用三個分區,每個分區對應於SalesHistoryArchive表中的每一種產品類型,這個表將在稍後定義。基本上,這些分區會把SalesHistoryArchive檔案表劃分成三個不同的表,它們由SQL Server自動維護。CREATE PARTITION FUNCTION [pf_Proct_Partition](VARCHAR(10)) AS RANGE LEFTFOR VALUES (N'BigScreen', N'Computer', N'PoolTable')定義函數的范圍決定分區值屬於哪一個邊界。RNAGE LEFT:指定分區值將小於或等於在分區函數中定義的值。在上面使用的分區函數中一共建立了四個分區。

B. 如何對已經存在的數據表進行分區

過程中為SQL Server數據表劃分為三個步驟:

1)建立分區函數

2)建立分區方案

3)對表的分區

第一步:建立分區函數

分區函數定義[U]如何[/ U],也就是你想怎麼SQL Server數據分區。這里不是一個特定的表作為一個例子,但總的技術部門總結的數據。

分區指定為每個分區用分區邊界來實現。例如,假設我們有一個客戶表,其中包含所有的企業客戶信息,客戶信息與客戶的唯一標識號,客戶編號從1到100萬。我們可以使用下面的分區功能(這里稱為customer_Partfunc)把這個表分為四個分區:

CREATE PARTITION FUNCTION customer_partfunc(INT)

AS RANGE RIGHT

輸入值( 250000,500000,750000)

這些邊界劃分指定了四個分區。第一個分區包含所有值?少於25萬的記錄。第二個分區包含所有值?之間250,000和499,999的記錄。第三個分區包含所有值?500,000至749,999記錄。大於或等於750,000的所有其他記錄都包含在第四個分區中。

請注意,此示例使用「RANGE RIGHT」條款。這表明,該邊界值是分區的右側。同樣,如果您使用「RANGE LEFT」條款,那麼第一個分區將包含所有的值小於或等於25萬條記錄;?第二個分區將包含所有的值250001和500000之間的記錄,等等??

第二步:創建

分區方案

一旦如何分區功能分區後的數據完整的定義,下一步是創建一個分區方案,定義[ U],其中[/ U],這就是你要分區的數據。這是一個非常簡單的過程,例如,如果我有四個文件組,從「FG1」到「FG4」的名字,那麼你可以使用下面的分區方案:

創建分區計劃customer_partscheme

作為間隔customer_partfunc

要(FG1,FG2,FG3,FG4)

請注意,我們現在把一個分區函數連接到分區規劃,但我們還沒有連接在分區方案的任何具體的資料庫表。這是重復使用的功能函數時。我們可以利用這個功能來分區方案(或只是一個分區函數)對資料庫表的任何數據。

第三步:表已分區

建立良好的分區方案後,就可以開始對表進行分區。這是最簡單的一步,只需加上「ON」子句中的表創建語句指定表的分區方案,並申請表列的分區方案。你不需要指定分區函數,分區方案已經因為分區函數定義。

例如,假設你想使用上述的分區方案來創建一個客戶表,您需要使用以下Transact-SQL語句:

CREATE TABLE客戶(姓數據類型為nvarchar(40),姓氏為nvarchar(40),CUSTOMERNUMBER INT)
開customer_partscheme(CUSTOMERNUMBER)

C. SqlServer是如何管理,分配存儲空間的呢

Sql Server 區管理(GAM,SGAM)


大家都知道Sql Server 中數據文件存儲的最小單位是頁面(Page),但實際SQLSERVE並不是以頁面為單位給數據分配空間的,Sql Server默認的存儲分配單位是盤區(Extend)。這樣做的主要原因是為了避免頻繁的讀寫IO,提升性能。在表或其它對象分配存儲空間,不是直接分配一個8K的頁面,而是以一個盤區(Extend)為存儲分配單位,一個盤區為8個頁面(Size = 8*8K=64K)。

這樣,對區得操作就會非常頻繁,也要求Sql Server有自己的一套系統管理著數量眾多的區。其中最突出的出一個問題,那就是在存儲那些只有少量數據,不足8K的對象,如果也是分配給一個盤區,就會存在存儲空間上的浪費,降低了空間分配效率。

為解決上述問題,SQLSERVER提供了一種解決方案,定義了兩種盤區類型,統一盤區和混合盤區。

全局分配映射表 (GAM):統一盤區,GAM 頁記錄已分配的區。每個 GAM 包含 64,000 個區,相當於近 4 GB 的數據。GAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區可用;如果位為 0,則區已分配。

共享全局分配映射表 (SGAM):由多個對象共同擁有該盤區,SGAM 頁記錄當前用作混合區且至少有一個未使用的頁的區。每個 SGAM 包含 64,000 個區,相當於近 4 GB 的數據。SGAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區正用作混合區且有可用頁。如果位為 0,則區未用作混合區,或者雖然用作混合區但其所有頁均在使用中。


在實際為對象分配存儲盤區時,為了提高空間利用率,默認的情況下,如果一個對象一開始大小小於8個頁面,就盡量放在混合盤區中,如果該對象大小增加到8個頁面後,SQLSERVER會為這個對象重新分配一個統一盤區。

據區當前的使用情況,GAM 和 SGAM 中每個區具有以下位模式:



第0個bit為保留位元組,始終為0

第1個bit表示該頁面是否已分配,我們知道GAM頁用來管理區是否已分配,但一個區包含8個頁面,所以用該bit用來准確定位該區的某個頁面是否已分配出去了。

第2個bit表示該頁面是否混合分區的一個頁面。

第3個bit表示該頁面是否是一個IAM(索引分配映射)頁面。

第4個bit表示該頁面中是否包含幻影或已刪除記錄,這有助於SQL Server定期清理幻影或已刪除記錄。

第5~7個頁面表示該頁面的空間使用率情況。

D. sqlserver分區表,可以不可以同時根據某幾個欄位分區

/********* 創建一個分布式分區視圖 ***************/
/********* [email protected] 邀月 ***************/

USE master
GO
EXEC sp_addlinkedserver
'AP4\NET2013',
N'SQL Server'
GO

-- 跳過遠程實例架構表的檢查,以提升性能,邀月注
EXEC sp_serveroption 'AP4\NET2013', 'lazy schema validation', 'true'
GO

--創建測試資料庫
IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = 'RemoteViewTest2012')
BEGIN
CREATE DATABASE RemoteViewTest2012
END
GO
--打開測試庫
Use RemoteViewTest2012
GO

--創建上海分公司的點擊表
CREATE TABLE dbo.WebHits_ShangHai
(WebHitID uniqueidentifier NOT NULL,
WebSite varchar(20) NOT NULL ,
HitDT datetime NOT NULL,
CHECK (WebSite = 'ShangHai'),
CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

第二個實例:

/***************實例 AP4\NET2013(SQL Server 2008) *********/
/********* [email protected] 邀月 ***************/
USE master
GO
EXEC sp_addlinkedserver
'AP4\NET2012',
N'SQL Server'
GO

-- 跳過遠程實例架構表的檢查,以提升性能,邀月注
EXEC sp_serveroption 'AP4\NET2012', 'lazy schema validation', 'true'
GO

IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = 'RemoteViewTest2012')
BEGIN
CREATE DATABASE RemoteViewTest2012
END
GO

--打開測試庫
Use RemoteViewTest2012
GO

--創建北京分公司的點擊表
CREATE TABLE dbo.WebHits_BeiJing
(WebHitID uniqueidentifier NOT NULL,
WebSite varchar(20) NOT NULL ,
HitDT datetime NOT NULL,
CHECK (WebSite = 'BeiJing'),
CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

二、在兩個實例中分別創建視圖

/***************實例 AP4\NET2012(SQL Server 2008) *********/
/********* [email protected] 邀月 ***************/

--打開測試庫
Use RemoteViewTest2012
GO

--創建分區視圖
CREATE VIEW dbo.v_WebHits AS
SELECT WebHitID,
WebSite,
HitDT
FROM RemoteViewTest2012.dbo.WebHits_ShangHai
UNION ALL
SELECT WebHitID,
WebSite,
HitDT
FROM [AP4\NET2013].RemoteViewTest2012.dbo.WebHits_BeiJing
GO

/***************實例 AP4\NET2013(SQL Server 2008) *********/
/********* [email protected] 邀月 ***************/

--打開測試庫
Use RemoteViewTest2012
GO

--創建分區視圖
CREATE VIEW dbo.v_WebHits AS
SELECT WebHitID,
WebSite,
HitDT
FROM RemoteViewTest2012.dbo.WebHits_BeiJing
UNION ALL
SELECT WebHitID,
WebSite,
HitDT
FROM [AP4\NET2012].RemoteViewTest2012.dbo.WebHits_ShangHai
GO

E. sqlserver查看哪些表有分區

SQLSERVER中,有時需要知道已經建了哪些分區表,從哪裡看?
1、直接用SQL語句查:
--分區數大於1的,就是我們想查看的分區表:
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 > [資料庫名稱] 節點 > 存儲(Storage) 節點 >
\ 分區架構(Partition Schemes ) 節點 > 選中一項 > 右鍵 > 查看依賴
\ 分區函數(Partition Functions ) 節點 > 選中一項 > 右鍵 > 生成腳本
3、有作多分區的表,屬性的 存儲(Storage) 會有 Partitioning 信息。

F. sqlserver 分區表有什麼好處

相當於把1個巨大的表拆分成數百個小表,特別是按照日期分,如果數據有3-5年,因為每次訪問可能只是幾天-幾個月,這樣就極大的縮少了數據范圍,掃描的數據量少了,速度自然快了。。
再加上使用分區索引後,分區索引是針對單個分區表的索引,這樣就會存在多個B+的索引,索引小了,維護起來自然快了,在單個分區里查詢,其面對的索引樹也是很小的,自然相關性能就提高了。。

G. sqlserver數據越來越多,原先表創建的分區不夠用了,怎麼樣添加新的

切換進PE系統,用遨梅分區,增加擴分區,或無損合並;只能相鄰的分區借空間,中間執行不能斷電的。注意保存。。。

H. SQL Server 自動化管理分區設計方案

一 設計說明

設計這個自動化的目的是想要交替 重復地使用固定的幾個分區(分區編號 ~ )來保存數據 當最後一個分區就是快滿的時候 我們會把最舊數據的分區的數據清空出分區 新數據就可以使用老分區空間了

應用這個自動化管理分區的環境是有些限制的 其一 分區的數據是呈現遞增的 比如分區欄位是自增Id值 或者是以日期作為分區;其二 可以接受 歷史數據被移除分區表帶來的問題 其三 一天進庫的數量不應大於分區管理表PartitionManage中Part_Value與 Change_Value的差 因為我們作業執行的頻率是 天 不過你可以調整Change_Value或者作業的執行頻率;

具體腳本可以參考 SQL Server 自動化刪除表分區設計方案

二 看圖說話

(圖 整體概念圖)

數據流經過分區方案 被分配到不同的分區中 從圖中可以看出 分區是可以重復利用的 後台有一個所謂的自動化切換分區的作業在跑 目的就是如果 重復利用這些分區 這里的PRIMARY目的就是說明它與其它文件組的一個平級關系 而且我們在做交換分區時候也會用到PRIMARY 需要事先分配足夠 的空間

(圖 自動化設計圖)

這是自動化切換分區作業的邏輯處理 其中分區管理表的設計是比較重要的 它的靈活度關繫到整個自動化的效果; 這個邏輯有以下幾個特點

分區的索引進行存儲位置對齊;其它索引在創建時就陵孫咐使用了分區方案 索引數據跟隨分區數據一起存儲在分區中;

分區管理表 包含了分區記錄數預警設計 在Id達到這個值後凱櫻就會進行交換分區;

分區管理表 FileGroup_String欄位的數據可以通過SQL腳本自動化生成 條件就是分區文件組名稱需要有規律;

臨時表是創建在PRIMARY主分區上 跟原表使用相同的分區方案;需要事先給PRIMARY分配大於或者等於一個分區文件大小的空間 這樣在交換分區的時候就不用增量為主分區分配數據空間;

交換舊數據到臨時表 使用下面的語句可以把數據交換到相同的分區中編號 這樣可以應對臨時表就是一個歷史表 而好處就是歷史表也同樣使用了分區

ALTER TABLE [tb] SWITCH PARTITION @PARTITION_num TO [Temp_tb] PARTITION@PARTITION_num

這里需要先修改分區方案 才能修改分區函數 這個跟創建分區函數與分區方案的順序是剛好相反的

(圖 分區管理表PartitionManage)

欄位說明 Change_Value(預警Id值)Part_Value(分區函數值)FileGroup_String(分區文件組名稱)IsDone(狀態)UpdateTime(更新時間);

這就是那個分區管理表(PartitionManage) 它是經過了幾個版本後才把欄位確定下來的 現在它已經比較完善了 能應對比較多的情況

比如我們可以修改預警值(Change_Value) 讓數據提早進入交換分區;

比如我們可以修改分區值(Part_Value) 達到調整分區間隔的目的;

比如我們可以修改分區文件組名稱(FileGroup_String) 達到跳級文件組的目的;通過修改分區管理表來設置分區值與分區文件組的對應關系;

再比如 我們一次性修改了分區方案和分區函數 已經去到很後面的分區值了 那麼我們只要設置這些分區值的狀態(IsDone)為 (True)就可以解決了

記錄了進行交換分區的時間(UpdateTime) 方便查詢;

(圖 分區為Id欄位的記錄分布圖)

這是一個實戰中的分區情況 這樣的分區特點就是分區裡面的記錄數基本上是持平的 在Partition_num= 的記錄中明顯多了很多記錄 這就是因為我們沒有及時進行交換分區造成的

(圖 分尺純區為ClassId(分類)欄位的記錄分布圖)

lishixin/Article/program/SQLServer/201311/22352

I. sqlserver2008怎麼實現自動分區表

/*第一步:創建分區函數*/

Create partition function Part_func_Bag(varchar(20)) as range right

/*正式區間

for values(N'01100923909760', N'01100936207030', N'6311001806524',N'92451400060101');*/for values(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714');goselect * from Bag where BagCode in(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714')

/*第二步:創建文件組和文件*/

alter database ZXAutoCode add filegroup [Bag_1]; alter database ZXAutoCode add filegroup [Bag_2];alter database ZXAutoCode add filegroup [Bag_3];alter database ZXAutoCode add filegroup [Bag_4];goalter database ZXAutoCode add file (name = Bag1_data,filename = 'E:\MSSQL\TESTDATA\Bag1_data.ndf',size = 3MB) to filegroup [Bag_1];alter database ZXAutoCode add file (name = Bag2_data,filename = 'E:\MSSQL\TESTDATA\Bag2_data.ndf',size = 3MB) to filegroup [Bag_2];alter database ZXAutoCode add file (name = Bag3_data,filename = 'E:\MSSQL\TESTDATA\Bag3_data.ndf',size = 3MB) to filegroup [Bag_3]; alter database ZXAutoCode add file (name = Bag4_data,filename = 'E:\MSSQL\TESTDATA\Bag4_data.ndf',size = 3MB) to filegroup [Bag_4]; go

/*第三步:創建分區方案並關聯到分區函數*/

Create partition scheme Part_func_Bag_scheme as partition Part_func_Bag to ([Bag_1],[Bag_2],[Bag_3],[Bag_4],[Primary]); go

/*第四步 重建索引(刪除聚集索引以及需要分區欄位的索引後重建該類索引,表被按分區值將分配到各文件組。數據在這一步開始轉移。)*/

EXEC sp_helpindex N'Bag' --查看orders中使用的索引 drop index idx_cl_od on Bag;gocreate clustered index idx_cl_od on Bag(bagcode) on Part_func_Bag_scheme(bagcode); go