精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

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

SQL Server大表分區優化

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

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


?
創建分區表
?

1、定義配分函數

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

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

2、創建分區方案

分區方案將分區映射到特定的文件組。文件組及文件需提前創建好。

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

3、創建分區表

在創建分區表時,請確保所有唯一索引或主鍵都包含分區列,以符合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作為主鍵的一部分,并將其與分區列對齊。


?
管理和使用分區表
?

插入數據

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

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);

查詢分區數據

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

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


?
分區表的維護
?

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

索引維護

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

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

統計數據更新

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

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

高效的數據管理

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

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

性能考慮

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

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


?       分區實戰        ?

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

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

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

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

以上各步驟的操作過程,是通過作業自動執行的,分區切換很快。作業分為以下步驟:

/******************************** step_1_分區切換 ***********************************/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)  --計算新分區劃分的時間set @prio_day = dateadd(d,-10,@now)        --計算10天前的時間,該時間需要合并set @next_fg = N'filegroup_'+convert(nvarchar(10),datediff(D,'2020-01-01',@now)%10+1) --計算下一個分區名稱--  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);--創建新的分區
--  切換第一個分區數據到另一個表(Logs 和 LogsMid 結構和索引要)ALTER TABLE Logs SWITCH PARTITION 1 TO LogsMidALTER TABLE IPRequests SWITCH PARTITION 1 TO IPRequestsMid
--  合并第一個分區,完成!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_更新統計信息 ***********************************/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

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

?       總結        ?

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

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


閱讀原文:原文鏈接


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

主站蜘蛛池模板: 无码人妻毛片丰满熟妇区毛片国产 | 在线观看视频你懂得 | 久久久久亚洲AV无码网站 | 人妻斩久久综合无码人妻 | 亚洲国产精品福利一区在线 | 手机看片1024欧美日韩你懂的 | 国产美女遭强高潮网站 | 麻豆精品国产剧情观看 | 国产日韩欧美综合 | 亚洲呦女专区 | 最新日韩中文字幕免费在线观看 | 欧美在线视频一区 | 国产在线精品一区二区高清不卡 | 人妻寂寞按摩中文字幕 | 日韩内射美女片在线观看网站 | 久久人妻无码aⅴ毛片a片动 | 日韩免费一级a毛片在线播放 | 2025亚洲国产精品无码 | 偷偷操不一样的久久 | 人妻系列影片无码专区久久 | 国产成人综合久久精品推 | 免费观看又色又爽又黄的忠诚 | 色爽黄1000部免费软件下载 | 久久精品人人槡人妻人人玩 | 亚洲激情另类欧美 | 欧美日韩精品一区二区在线观看 | 亚洲av无码乱码在线观看四虎 | 国产成人无码免费看片软件 | 欧美日韩一区二区黑人综合 | 无码中文人妻在线一区二区三区 | 亚洲精品久久久久久 | 少妇人妻无码久久久久久 | 国产特级毛片a级视频 | 久久强奷乱码老熟女网站 | 国产成人午夜精品55 | 色与欲影视天天影视综 | 精品免费国产一区二区三区四区 | 久久精品国内一区二区三区 | 性爱综合网| 青春草视频在线 | 久久精品国产99国产电影网 |