LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網站管理員

SQL Server大表分區(qū)優(yōu)化

admin
2025年1月9日 21:53 本文熱度 206

SQL Server表分區(qū)是提高數據庫性能和管理的寶貴特性,尤其是對大型表。其他主流的關系型數據庫也會有表分區(qū)的功能,通過將大型表劃分為更小、更易于管理的分區(qū),有助于大型表管理。每個分區(qū)都可以存儲在單獨的文件組中,從而提高了查詢性能,簡化了備份和索引重建等維護任務。


?
創(chuàng)建分區(qū)表
?

1、定義配分函數

分區(qū)函數指示如何將表中的行映射到不同的分區(qū)。分區(qū)函數和表的分區(qū)列必須具有相同的數據類型。

-- 刪除分區(qū)函數IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = 'PFYear')BEGIN    DROP PARTITION FUNCTION PFYear;ENDGO-- 創(chuàng)建分區(qū)函數CREATE PARTITION FUNCTION PFYear (date)AS RANGE RIGHT FOR VALUES ('2021-01-01', '2022-01-01', '2023-01-01', '2024-01-01');GO

2、創(chuàng)建分區(qū)方案

分區(qū)方案將分區(qū)映射到特定的文件組。文件組及文件需提前創(chuàng)建好。

-- 刪除分區(qū)方案IF EXISTS (SELECT * FROM sys.partition_schemes WHERE name = 'PSYear')BEGIN    DROP PARTITION SCHEME PSYear;ENDGO-- 創(chuàng)建分區(qū)方案(提前創(chuàng)建文件組及文件)CREATE PARTITION SCHEME PSYear AS PARTITION PFYearTO (FG2021, FG2022, FG2023, FG2024, [PRIMARY]);GO

3、創(chuàng)建分區(qū)表

在創(chuàng)建分區(qū)表時,請確保所有唯一索引或主鍵都包含分區(qū)列,以符合SQL Server的要求。

CREATE TABLE Sales (    SaleID int IDENTITY(1,1),    SaleDate date,    TotalAmount money,    CustomerID int,    ProductID int,    Quantity int,    PRIMARY KEY (SaleDate, SaleID)) ON PSYear (SaleDate);GO

該結構使用SaleDate作為主鍵的一部分,并將其與分區(qū)列對齊。


?
管理和使用分區(qū)表
?

插入數據

以下測試按不同年份插入數據,數據將自動分布在不同分區(qū)上:

INSERT INTO Sales (SaleDate, TotalAmount, CustomerID, ProductID, Quantity)VALUES ('2018-03-15', 120.50, 1, 101, 2),       ('2019-07-22', 75.00, 2, 102, 1),       ('2020-05-11', 200.00, 3, 103, 5),       ('2021-12-01', 150.00, 4, 104, 3);

查詢分區(qū)數據

要查看跨分區(qū)的數據分布,可以運行:

SELECT $PARTITION.YearPartitionFunction(SaleDate) AS PartitionNumber, COUNT(*) AS RecordsFROM SalesGROUP BY $PARTITION.YearPartitionFunction(SaleDate);GO


?
分區(qū)表的維護
?

對分區(qū)表進行有針對性的維護可以減少停機時間并優(yōu)化數據庫性能。

索引維護

可以在每個分區(qū)的基礎上重建或重新組織索引,重點關注數據修改頻繁的區(qū)域。下面命令表示在第三個分區(qū)上重建索引。

-- SP_HELP SalesALTER INDEX IX_SaleDate ON Sales REBUILD PARTITION = 3;GO

統(tǒng)計數據更新

保持特定分區(qū)的統(tǒng)計信息更新有助于SQL Server查詢優(yōu)化器做出明智的決策,從而提高性能。下面更新第三個分區(qū)的統(tǒng)計信息。

UPDATE STATISTICS Sales (IX_SaleDate) WITH RESAMPLE ON PARTITIONS(3);GO

高效的數據管理

SQL Server的分區(qū)允許通過分區(qū)輕松歸檔或刪除數據。

ALTER TABLE Sales SWITCH PARTITION 10 TO Archive.Sales PARTITION 10;GO

性能考慮

  • 分區(qū)對齊:索引應該與分區(qū)方案對齊。這意味著在任何唯一索引或主鍵中包含分區(qū)列。

  • 監(jiān)視傾斜:定期檢查跨分區(qū)數據分布中的傾斜。傾斜會導致性能不均勻,可能需要調整配分函數。


?       分區(qū)實戰(zhàn)        ?

我們有2張日志表 Logs 與 IPRequests 插入數據較頻繁。兩表沒有業(yè)務需求,日常偶爾用于查看系統(tǒng)錯誤信息,給開發(fā)同事排錯用。我們對兩表 Logs 與 IPRequests 都創(chuàng)建了分區(qū),保留10天數據,10天前的數據分別遷移到另一個中間表 LogsMid 與 IPRequestsMid。中間表不用分區(qū),但結構和索引要和原來的表一樣。數據遷移到中間表后,中間表會再將數據遷移到另一個歸檔數據庫 T_TempDB 的表 dbo.T_Logs_history 與 dbo.T_IPRequests_history。而表 T_Logs_history 和 T_IPRequests_history 只保留30天數據!

對于分區(qū)表的設置,允許鎖升級到分區(qū)鎖,不用升級到表鎖。

ALTER TABLE [dbo].[Logs] SET (LOCK_ESCALATION=AUTO)GOALTER TABLE [dbo].[IPRequests] SET (LOCK_ESCALATION=AUTO)GO

更多參考:SQL Server 表選項 LOCK_ESCALATION 對分區(qū)的影響

以上各步驟的操作過程,是通過作業(yè)自動執(zhí)行的,分區(qū)切換很快。作業(yè)分為以下步驟:

/******************************** step_1_分區(qū)切換 ***********************************/declare @now date;declare @next_day nvarchar(10);declare @prio_day datetime;declare @next_fg nvarchar(50);declare @sql nvarchar(500);set @now = getdate()set @next_day = convert(varchar(10),@now,120)  --計算新分區(qū)劃分的時間set @prio_day = dateadd(d,-10,@now)        --計算10天前的時間,該時間需要合并set @next_fg = N'filegroup_'+convert(nvarchar(10),datediff(D,'2020-01-01',@now)%10+1) --計算下一個分區(qū)名稱--  SELECT @now as [now],@next_day as next_day,@prio_day as prio_day,@next_fg as next_fg
SET @sql = N'ALTER PARTITION SCHEME PS_DateTime NEXT USED ' + @next_fg + '; 'set @sql = @sql + N'ALTER PARTITION FUNCTION PF_DateTime() SPLIT RANGE(''' + @next_day + ''');'exec(@sql);--創(chuàng)建新的分區(qū)
--  切換第一個分區(qū)數據到另一個表(Logs 和 LogsMid 結構和索引要)ALTER TABLE Logs SWITCH PARTITION 1 TO LogsMidALTER TABLE IPRequests SWITCH PARTITION 1 TO IPRequestsMid
--  合并第一個分區(qū),完成!ALTER PARTITION FUNCTION PF_DateTime() MERGE RANGE(@prio_day);

/******************************** step_2_插入到歷史表 ***********************************/--LogsMid 和 IPRequestsMid 為切換的中間表,需要及時把數據遷移到其他表中。insert into T_TempDB.dbo.T_Logs_history select * from dbo.LogsMid;GOinsert into T_TempDB.dbo.T_IPRequests_history select * from dbo.IPRequestsMid;GO
/******************************** step_3_清除切換臨時數據 ***********************************/--中間表不保存數據truncate table dbo.LogsMid;GOtruncate table dbo.IPRequestsMid;GO
/******************************** step_4_更新統(tǒng)計信息 ***********************************/update statistics dbo.Logs;GOupdate statistics dbo.IPRequests;GO
/******************************** step_5_刪除一月前歷史數據 ***********************************/DELETE FROM T_TempDB.dbo.T_Logs_history WHERE OperationTime <= DATEADD(M,-1,GETDATE())GODELETE FROM T_TempDB.dbo.T_IPRequests_history WHERE AddTime <= DATEADD(M,-1,GETDATE())GO

通過分區(qū)及分區(qū)維護,我們查詢數據性能大大提高了。

?       總結        ?

SQL Server表分區(qū)可以顯著提高大型數據庫的性能、管理性和可擴展性。同樣也可以簡化備份與恢復。

對于日志表的考慮,如果是比較重要的業(yè)務操作日志,個人建議最好單獨使用一個數據庫。我們知道操作日志非常頻繁,數據量也會非常大,但又不是那么重要。單獨日志庫會大大減少業(yè)務庫的大小,這樣對業(yè)務庫的備份恢復、數據同步、參數設置等都有非常好的性能。如果操作日志沒那么重要,可以不必存儲在關系型數據庫中,非關系型數據庫有較好的擴展性、壓縮性、高效搜索、多數據模型等。


閱讀原文:原文鏈接


該文章在 2025/1/10 11:11:10 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲伊人久久成综合人影院 | 日韩成AV人网站在线播放 | 午夜福利国产小视频在线 | 在线看片免费人成视频丨 | 亚洲精品揄拍自拍第一页 | 欧美精品剧情一区二区三区 |