(3)SQL Server表分區

来源:https://www.cnblogs.com/wzk153/archive/2020/04/08/12659049.html
-Advertisement-
Play Games

1.簡介 當一個表數據量很大時候,很自然我們就會想到將表拆分成很多小表,在執行查詢時候就到各個小表去查,最後彙總數據集返回給調用者加快查詢速度。比如電商平臺訂單表,庫存表,由於長年累月讀寫較多,積累數據都是異常龐大的,這時候,我們可以想到表分區這個做法,降低運維和維護成本,提高讀寫性能。比如將前半年 ...


1.簡介

當一個表數據量很大時候,很自然我們就會想到將表拆分成很多小表,在執行查詢時候就到各個小表去查,最後彙總數據集返回給調用者加快查詢速度。比如電商平臺訂單表,庫存表,由於長年累月讀寫較多,積累數據都是異常龐大的,這時候,我們可以想到表分區這個做法,降低運維和維護成本,提高讀寫性能。比如將前半年訂單放一個歷史分區表,不活躍庫存放一個歷史分區表。截止到SQL Server 2016,一張表或一個索引最多可以有15000個分區。

2.表分區

2.1分區範圍

分區範圍是指在要分區的表中,根據業務選擇表中的關鍵欄位做為分區邊界條件,分區後,數據所在的具體位置至關重要,這樣才能在需要時只訪問相應的分區。註意分區是指數據的邏輯分離,不是數據在磁碟上的物理位置,數據的位置由文件組來決定,所以一般建議一個分區對應一個文件組。

2.2分區鍵

分區表中的欄位可以作為分區鍵,比如庫存表中供應商ID。對錶和索引進行分區的第一步就是定義分區的關鍵數據。

2.3索引分區

除了對錶的數據集進行分區之外,還可以對索引進行分區,使用相同的函數對錶及其索引進行分區通常可以優化性能。

3.創建表分區

3.1創建文件組

在這裡演示示例當中,我根據業務場景在TestDB資料庫新增三個文件組,而三個文件組分別對應三個分區。而多個文件組好處是可以按照不同業務場景將數據放在對應文件組當中,優化性能同時好維護數據。文件組數量由硬體決定,最好是一個文件組對應一個分區,好維護。而通常文件組都處於不同磁碟上的,但是由於是演示,我只在一個磁碟中存放。

--創建四個文件組
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup1
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup2
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup3

3.2指定文件組存放路徑

在創建文件組之後,指定文件組存放磁碟位置,文件大小。

--創建四個ndf文件,對應到各文件組中,FILENAME文件存儲路徑
ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile1',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile1.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup1

ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile2',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile2.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup2

ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile3',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile3.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup3

註(附上刪除文件組T-SQL):

ALTER DATABASE [TestDB] REMOVE FILE SupIDGroupFile3


可以通過以下T-SQL語句查看文件組存放相關信息:

SELECT file_id,type,type_desc,data_space_id,name,physical_name,state_desc,size,growth
FROM sys.database_files

3.3創建分區函數

如何創建表分區邊界值,我們肯定要根據業務場景來決定。比如我測試庫庫存表有36萬左右數據,而有些供應商的庫存數據遠遠比其他供應商大,那麼我可以考慮使用供應商ID欄位作為邊界值分區。例如:根據T-SQL統計,18080供應商庫存數據最大,那麼我可以根據18080供應商上下分為三個區。

第一個分區範圍記錄:供應商ID小於等於13570的39097條庫存數據。

第二個分區範圍記錄:供應商ID大於13570和小於等於18079的45962條庫存數據。

第三個分區範圍記錄:供應商ID大於18079小於等於18080的164937條庫存數據。

第四個分區範圍記錄:供應商ID大於18080的111116條庫存數據。

根據上述分區範圍記錄,我們可以將供應商ID作為邊界值設置,執行以下T-SQL語句設置邊界值:

--設置邊界值
CREATE PARTITION FUNCTION PF_SupplierID(int)
AS RANGE LEFT FOR VALUES (13570,18079,18080)

執行完畢後如圖所示:

3.4創建分區方案

執行以下T-SQL語句創建分區方案:

--創建分區方案
CREATE PARTITION SCHEME PS_SupplierID
AS PARTITION PF_SupplierID TO ([PRIMARY], [SupIDGroup1],[SupIDGroup2],[SupIDGroup3])

執行完畢後如圖所示:

3.5創建分區表

上面那些分區步驟都是為了接下來創建分區表這一步驟而準備的。廢話不多說,現在我們來看看如何創建分區表。右鍵需要分區的表->儲存->創建分區,具體步驟如下圖所示:





3.6創建分區索引

--創建分區索引
CREATE NONCLUSTERED INDEX [NCI_SupplierID] ON dbo.Stock
(
    SupplierID ASC
)
INCLUDE ( [Model],[Brand],[Encapsulation]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

或者

執行完畢後如圖所示:


創建好索引之後,我們來看看分區情況:

--查看各分區有多少行數據
SELECT * FROM (
SELECT $PARTITION.PF_SupplierID([SupplierID]) AS Patition,COUNT(*) AS CountRows FROM dbo.Stock
GROUP BY $PARTITION.PF_SupplierID([SupplierID])
)TB ORDER BY Patition

最後我們來看看加了索引之後表數據查詢情況:

4.表分區的優缺點

優點:
改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用。
維護方便:如果表的某個分區出現故障,需要修複數據,只修複該分區即可。
均衡I/O:可以把不同的分區映射到不同磁碟以平衡I/O,改善整個系統性能。
缺點:
分區表相關:已經存在的表沒有方法可以直接轉化為分區表。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統版本CentOS6.10_x64 開啟防火牆命令:service iptables start 關閉防火牆命令:service iptables stop 重啟防火牆命令:service iptables restart 查看防火牆狀態:service iptables status linux ...
  • 前言: 2020年3月7日晚7點,大佬張祥在微信群向大家詳細介紹了58同城HBase平臺及其生態的建設實踐與相關經驗,確實講得很好。今天花了點時間幫大家整理了一下,希望更多的沒有參與直播的朋友能夠看到它,也歡迎大家積極轉發一下,視頻與PPT 相關資料附於文末 。 亮點在哪 該分享的亮點在哪兒里呢?這 ...
  • 用單表接近一千萬數據(四列:int,兩個varchar,日期時間)測,發現幾個效率幾乎一致 count(0)=count(1)=count(數字)=count(*)>count(primary key)>count(column) 根據相關解釋: 1. count(指定的有效值)--執行計劃都會轉化 ...
  • 在高性能mysql第三版里,說到hash索引以下優缺點: 用MySQL(5.7.)測的時候發現可以範圍查詢。 ...
  • 我所做的商城項目前些時提了新需求,要求前臺搜索商品除了能通過商品名稱搜索到以外,還可以通過別個信息搜索,比如:商品編號、詳情內容描述等等,類似於全文搜索了。我首先想到的就是lucene,但是對代碼這樣的改動量就太大了。。。。目前線上版本如果做這種改動怕測試又出什麼么蛾子,如果又重新建表將這些信息另外 ...
  • 題目如下: 1.查詢sC表中的全部數據。2. 查詢電腦系學生的姓名和年齡3.查詢成績在70~80分的學生的學號、課程號和成績4.查詢電腦系年齡在18~20歲的男生姓名和年齡s.查詢C001課程的最高分6.查詢電腦系學生的最大年齡和最小年齡7.統計每個系的學生人數8.統計每]課程的選課人數和最高 ...
  • 一、MySQL體繫結構和存儲引擎 儘管各個平臺在底層(如線程)實現方面都各不相同,但MySQL基本上能保證在各個平臺上的物理結構的一致性。因此,用戶應該能很好的理解MySQL資料庫在所有這些平臺是如何運作的。 1.1 定義資料庫和實例 資料庫:物理操作系統文件或其他形式文件類型的集合。在MySQL數 ...
  • 情況: A機上有SSMS 18.x, B機上有SQL Server 2008 R2資料庫, C機上有Oracle Database 11.2.0.4.0資料庫 我想在A機用ssms連C機的oracle,一番瞭解,普遍做法是裝ODAC xcopy包,裡面有oledb組件,然後就可以在sqlserver ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...