ตารางพาร์ติชันสําหรับมาตราส่วน
การตัดสินใจแบ่งพาร์ติชันเกือบจะถาวร คีย์พาร์ติชันที่เลือกไม่ดีทําให้ประสิทธิภาพแย่กว่าตารางที่ไม่ได้แบ่งพาร์ติชัน และการแบ่งพาร์ติชันตารางหลายเทราไบต์ใหม่จําเป็นต้องสร้างใหม่ทั้งหมดด้วยการหยุดทํางานหลายชั่วโมง คีย์พาร์ติชันและการจัดตําแหน่งดัชนีที่คุณเลือกระหว่างการออกแบบจะกําหนดว่าการแบ่งพาร์ติชันจะปรับปรุงระบบของคุณหรือสร้างฝันร้ายในการบํารุงรักษาที่คุณไม่สามารถเลิกทําได้อย่างง่ายดาย
การแบ่งพาร์ติชันตารางจะแบ่งตารางขนาดใหญ่ออกเป็นส่วนเล็ก ๆ ที่จัดการได้มากขึ้น (พาร์ติชัน) ในขณะที่เก็บไว้เป็นตารางตรรกะเดียว แอปพลิเคชันของคุณเห็นตารางเดียว แต่กลไกฐานข้อมูลจะจัดการเซ็กเมนต์ทางกายภาพหลายเซ็กเมนต์ที่สามารถบํารุงรักษา เก็บถาวร หรือสืบค้นได้อย่างอิสระ
ทําความเข้าใจแนวคิดการแบ่งพาร์ติชัน
การแบ่งพาร์ติชันเกี่ยวข้องกับองค์ประกอบหลักหลายประการ: ฟังก์ชันพาร์ติชัน ที่กําหนดวิธีการแบ่งข้อมูล โครงร่างพาร์ติชัน ที่แมปพาร์ติชันกับกลุ่มไฟล์และ คอลัมน์การแบ่งพาร์ติชัน ที่กําหนดว่าแต่ละแถวเป็นของพาร์ติชันใด การทําความเข้าใจแนวคิดเหล่านี้จะช่วยให้คุณออกแบบกลยุทธ์การแบ่งพาร์ติชันที่มีประสิทธิภาพ
ประเมินผลการดําเนินงานและผลประโยชน์ในการดําเนินงาน
การแบ่งพาร์ติชันให้การปรับปรุงประสิทธิภาพการสืบค้นผ่านการกําจัดพาร์ติชันที่การสืบค้นกรองตามการเข้าถึงคีย์พาร์ติชันเฉพาะพาร์ติชันที่เกี่ยวข้อง (หนึ่งเดือนแทนที่จะเป็น 120 เดือน) การประมวลผลแบบขนานที่หลายพาร์ติชันถูกประมวลผลพร้อมกันในคอร์ CPU สถิติที่เร็วขึ้นคํานวณต่อพาร์ติชันแทนที่จะเป็นทั้งตารางและดัชนีค้นหาที่พาร์ติชันที่เล็กกว่าหมายถึงต้นไม้ B ที่ตื้นกว่า
ประโยชน์ในการดําเนินงาน ได้แก่ การบํารุงรักษาแบบละเอียดซึ่งคุณสร้างดัชนีใหม่บนพาร์ติชันปัจจุบันในขณะที่พาร์ติชันเก่ายังคงออนไลน์การเก็บถาวรที่รวดเร็วโดยการเปลี่ยนพาร์ติชันเก่าเป็นตารางเก็บถาวรในไม่กี่วินาทีผ่านการดําเนินการข้อมูลเมตาความพร้อมใช้งานที่ดีขึ้นจากการบํารุงรักษาพาร์ติชันอย่างอิสระและที่เก็บข้อมูลแบบแบ่งชั้นโดยการย้ายพาร์ติชันเก่าไปยังที่เก็บข้อมูลที่ถูกกว่าและช้าลง
ตัวอย่างเช่น ลองนึกภาพบริษัทที่ให้บริการทางการเงินที่มีตารางธุรกรรมขนาด 1.2 TB ที่การกรองแบบสอบถามตามวันที่ (90% ของแบบสอบถาม) จะสแกนทั้งตาราง หลังจากใช้การแบ่งพาร์ติชันรายเดือนประสิทธิภาพการสืบค้นจะดีขึ้น 10-20x ผ่านการกําจัดพาร์ติชันการสร้างดัชนีใหม่จาก 6 ชั่วโมงเป็น 20 นาทีต่อพาร์ติชันการเก็บถาวรข้อมูลเก่าจะลดลงจากการล็อกสี่ชั่วโมงเป็นวินาทีโดยใช้การสลับพาร์ติชันและต้นทุนการจัดเก็บลดลง 40% โดยการย้ายพาร์ติชันเก่าไปยังที่เก็บข้อมูลที่ถูกกว่า
ทําความเข้าใจว่าเมื่อใดควรใช้การแบ่งพาร์ติชัน
ตารางต่อไปนี้แสดงให้เห็นว่าการแบ่งพาร์ติชันช่วยได้เมื่อใดเมื่อเทียบกับการเพิ่มความซับซ้อนที่ไม่จําเป็น:
| สถานการณ์สมมติ | ใช้การแบ่งพาร์ติชัน? | ทําไม |
|---|---|---|
| การสืบค้นกรองในคอลัมน์เฉพาะ (วันที่ ภูมิภาค) 80%+ ของเวลา | ใช่ | การกําจัดพาร์ติชันเข้าถึงเฉพาะพาร์ติชันที่เกี่ยวข้องเท่านั้น |
| การเก็บถาวรข้อมูลเก่าเป็นประจํา (รายเดือน รายไตรมาส) | ใช่ | สลับพาร์ติชันออกในไม่กี่วินาทีแทน DELETE การดําเนินการ |
| จําเป็นต้องสร้างดัชนีใหม่จากข้อมูลล่าสุดเท่านั้น | ใช่ | สร้างพาร์ติชันปัจจุบันใหม่ในขณะที่พาร์ติชันเก่ายังคงออนไลน์ |
| ตารางขนาดใหญ่ (หลาย TB) ที่มีความต้องการพื้นที่จัดเก็บข้อมูลแบบแบ่งชั้น | ใช่ | ย้ายพาร์ติชันเก่าไปยังที่เก็บข้อมูลที่ถูกกว่า |
| แบบสอบถามส่วนใหญ่จะสแกนตารางแบบเต็มหรือกรองคอลัมน์ต่างๆ | ไม่ | สแกนพาร์ติชันทั้งหมด—ประสิทธิภาพที่แย่กว่าที่ไม่ได้แบ่งพาร์ติชัน |
| การค้นหาแถวเดียวหรือการสแกนช่วงขนาดเล็กเป็นเรื่องปกติ | ไม่ | การแบ่งพาร์ติชันเพิ่มค่าใช้จ่ายโดยไม่มีประโยชน์ |
| ไม่มีคอลัมน์ที่ชัดเจนสอดคล้องกับรูปแบบคิวรี | ไม่ | ไม่สามารถเลือกคีย์พาร์ติชันที่มีประสิทธิภาพ |
สร้างส่วนประกอบการแบ่งพาร์ติชัน
ตัวอย่างต่อไปนี้แสดงส่วนประกอบสามส่วน: ฟังก์ชันพาร์ติชัน โครงร่างพาร์ติชัน และตารางพาร์ติชัน:
-- Create partition function based on date ranges
-- Use RANGE RIGHT for datetime columns to keep same-day values together
CREATE PARTITION FUNCTION PF_OrderDate (DATETIME2)
AS RANGE RIGHT FOR VALUES
('2024-01-01', '2024-04-01', '2024-07-01', '2024-10-01');
-- Create partition scheme mapping to a single filegroup (recommended)
-- Use multiple filegroups only for tiered storage or independent backups
CREATE PARTITION SCHEME PS_OrderDate
AS PARTITION PF_OrderDate ALL TO ([PRIMARY]);
-- Create partitioned table
-- Include partition column in primary key for clustered index alignment
CREATE TABLE Orders (
OrderID INT NOT NULL,
OrderDate DATETIME2 NOT NULL,
CustomerID INT,
Amount DECIMAL(10,2),
CONSTRAINT PK_Orders PRIMARY KEY (OrderID, OrderDate)
) ON PS_OrderDate(OrderDate);
ตัวอย่างนี้สร้างพาร์ติชันรายไตรมาสสําหรับตาราง ใบสั่งซื้อ ฟังก์ชันพาร์ติชันกําหนดค่าขอบเขตสี่ค่า (มกราคม เมษายน กรกฎาคม ตุลาคม) สร้างห้าพาร์ติชัน: หนึ่งพาร์ติชันสําหรับข้อมูลก่อนปี 2024 และสี่พาร์ติชันสําหรับแต่ละไตรมาสของปี 2024 โครงร่างพาร์ติชันแมปพาร์ติชันทั้งหมดกับกลุ่มไฟล์ PRIMARY ตาราง Orders ใช้คอลัมน์ OrderDate เป็นคีย์พาร์ติชัน ซึ่งต้องรวมอยู่ในคีย์หลักสําหรับการจัดตําแหน่งดัชนีที่เหมาะสม
เลือกกลยุทธ์การแบ่งพาร์ติชัน
คีย์พาร์ติชันเป็นการตัดสินใจที่สําคัญที่สุดของคุณ เลือกไม่ดีและการแบ่งพาร์ติชันเจ็บมากกว่าช่วย คีย์พาร์ติชันในอุดมคติจะปรากฏในส่วน WHERE คําสั่งของคิวรีส่วนใหญ่สร้างพาร์ติชันที่สมดุลอย่างสมเหตุสมผลและสอดคล้องกับรูปแบบการบํารุงรักษาของคุณ
เกณฑ์การเลือกคีย์ต่อไปนี้ช่วยให้คุณเลือกคีย์พาร์ติชันที่เหมาะสม:
- รูปแบบคิวรี: 80%+ ของคิวรีกรองตามคอลัมน์นี้
- การกระจายข้อมูล: การกระจายที่สม่ําเสมอข้ามพาร์ติชัน (ไม่มีพาร์ติชันเดียวที่มีข้อมูล 90%)
- การจัดตําแหน่งการบํารุงรักษา: ตรงกับรูปแบบการเก็บถาวร/การล้างข้อมูล (คอลัมน์วันที่สําหรับการเก็บถาวรตามเวลา)
- ความเสถียร: ค่าไม่เปลี่ยนแปลงหลังจากแทรก (หลีกเลี่ยงการแบ่งพาร์ติชันบนคอลัมน์ที่ปรับปรุงได้)
ทําความเข้าใจการแบ่งช่วง
การแบ่งช่วงจะแบ่งข้อมูลตามช่วงค่า ซึ่งส่วนใหญ่เป็นวันที่ แต่ละพาร์ติชันมีช่วงเฉพาะ (ข้อมูลเดือนมกราคมข้อมูลเดือนกุมภาพันธ์ ฯลฯ ) นี่เป็นกลยุทธ์ที่ใช้กันอย่างแพร่หลายมากที่สุด
นี่คือจุดที่การแบ่งพาร์ติชันช่วงทํางานได้ดีที่สุด:
- ข้อมูลอนุกรมเวลา (คําสั่งซื้อ บันทึก ธุรกรรม)
- ข้อมูลตามลําดับ (หมายเลขใบแจ้งหนี้ รหัสใบสั่ง)
- ช่วงตัวเลข (แถบเงินเดือน ระดับราคา)
ตารางต่อไปนี้แสดงรูปแบบพาร์ติชันทั่วไป:
| Pattern | ควรใช้เมื่อใด |
|---|---|
| ประจำวัน | ระบบปริมาณมาก การเก็บรักษาสั้น |
| รายสัปดาห์ | ปริมาณปานกลาง เก็บรักษา 6-12 เดือน |
| รายเดือน | ที่พบบ่อยที่สุดคือยอดคงเหลือจํานวนพาร์ติชันและขนาด |
| ไตร มาส | ปริมาณที่ลดลง การเก็บรักษาเป็นเวลาหลายปี |
| รายปี | สถานการณ์การเก็บถาวรข้อมูลในอดีตระยะยาว |
ตัวอย่างเช่น แพลตฟอร์มอีคอมเมิร์ซที่แบ่งพาร์ติชันคําสั่งซื้อรายเดือนช่วยให้การสืบค้นเดือนปัจจุบันเข้าถึงหนึ่งพาร์ติชัน รายงานรายไตรมาสเพื่อเข้าถึง 3 พาร์ติชัน และการวิเคราะห์สิ้นปีเพื่อใช้ 12 พาร์ติชันในขณะที่กําจัดปีเก่า
คุณสามารถสร้างพาร์ติชันช่วงได้โดยการกําหนดขอบเขตในฟังก์ชันพาร์ติชัน:
-- RANGE RIGHT creates 5 partitions: <100000, 100000-199999, 200000-299999, 300000-399999, >=400000
CREATE PARTITION FUNCTION PF_InvoiceNumber (INT)
AS RANGE RIGHT FOR VALUES
(100000, 200000, 300000, 400000);
พาร์ติชันตามค่าตามหมวดหมู่
คุณสามารถใช้ RANGE การแบ่งพาร์ติชันด้วยสตริงหรือค่าตามหมวดหมู่ เช่น ภูมิภาค ฟังก์ชันพาร์ติชันจะวางค่าตามลําดับการจัดเรียง วิธีการนี้ใช้ได้กับการกระจายทางภูมิศาสตร์ ระบบหลายผู้เช่า หรือข้อมูลแผนกที่คิวรีมักจะกรองตามประเภท
ตัวอย่างต่อไปนี้แบ่งพาร์ติชันข้อมูลตามภูมิภาค:
-- Partition by region
CREATE PARTITION FUNCTION PF_Region (NVARCHAR(50))
AS RANGE LEFT FOR VALUES ('East', 'North', 'South', 'West');
CREATE PARTITION SCHEME PS_Region
AS PARTITION PF_Region ALL TO ([PRIMARY]);
CREATE TABLE RegionalData (
DataID INT NOT NULL,
Region NVARCHAR(50) NOT NULL,
Value DECIMAL(10,2),
CONSTRAINT PK_RegionalData PRIMARY KEY (DataID, Region)
) ON PS_Region(Region);
ใช้การแบ่งพาร์ติชันดัชนี
เมื่อคุณแบ่งพาร์ติชันตาราง ดัชนีสามารถจัดแนวหรือไม่จัดแนวได้ ดัชนีที่จัดแนวจะใช้โครงร่างพาร์ติชันเดียวกันกับตาราง ในขณะที่ดัชนีที่ไม่จัดแนวจะใช้การแบ่งพาร์ติชันที่แตกต่างกันหรือไม่มีการแบ่งพาร์ติชัน ตามค่าเริ่มต้น ดัชนีที่ไม่ใช่คลัสเตอร์บนตารางที่แบ่งพาร์ติชันจะสืบทอดโครงร่างพาร์ติชันของตาราง
ทําความเข้าใจดัชนีที่สอดคล้องกันและไม่สอดคล้องกัน
ดัชนีที่จัดแนว จะใช้ฟังก์ชันพาร์ติชันเดียวกันกับตาราง พาร์ติชันดัชนีแต่ละพาร์ติชันตรงกับพาร์ติชันตารางทําให้สามารถสลับพาร์ติชันได้อย่างรวดเร็วการบํารุงรักษาที่ง่ายขึ้นและการกําจัดพาร์ติชันที่ดีขึ้น
ดัชนีที่ไม่จัดแนว ใช้การแบ่งพาร์ติชันที่แตกต่างกันหรือไม่มีการแบ่งพาร์ติชัน ไม่สามารถใช้การสลับพาร์ติชันและไม่ได้รับการสนับสนุนบนตารางที่มีพาร์ติชันมากกว่า 1,000 พาร์ติชัน
ใช้ดัชนีที่จัดแนวเมื่อคุณต้องการสลับพาร์ติชันสําหรับการเก็บถาวร ต้องการสร้างพาร์ติชันเฉพาะใหม่อย่างอิสระ หรือเมื่อรูปแบบคิวรีกรองบนคีย์พาร์ติชัน
ตัวอย่างเช่น ลองนึกภาพตาราง Orders ที่แบ่งพาร์ติชันโดย OrderDate ที่มีดัชนีที่ไม่ใช่คลัสเตอร์บน CustomerID การใช้การแบ่งพาร์ติชันที่สอดคล้องกับโครงร่าง OrderDate เดียวกันช่วยให้สามารถเก็บถาวรเดือนเก่าได้โดยการสลับพาร์ติชันสร้างดัชนีปัจจุบันใหม่อย่างอิสระและวางพาร์ติชันเก่าโดยไม่ส่งผลกระทบต่อทั้งตาราง
คุณสามารถสร้างดัชนีที่แบ่งพาร์ติชันโดยใช้โครงร่างพาร์ติชันเดียวกันกับตารางฐาน:
-- Create partitioned non-clustered index
CREATE NONCLUSTERED INDEX IX_Orders_Customer
ON Orders(CustomerID)
ON PS_OrderDate(OrderDate);
-- Create partitioned columnstore index
CREATE NONCLUSTERED COLUMNSTORE INDEX IX_SalesData_CS
ON SalesData(Revenue, Region)
ON PS_SalesDate(SaleDate);
จัดการการทํางานของพาร์ติชัน
หลังจากสร้างตารางที่แบ่งพาร์ติชันแล้วคุณต้องจัดการเมื่อเวลาผ่านไป การดําเนินการทั่วไป ได้แก่ การสืบค้นข้อมูลเมตาของพาร์ติชันการเพิ่มพาร์ติชันใหม่เมื่อข้อมูลเติบโตและการลบพาร์ติชันเก่าระหว่างการเก็บถาวร การดําเนินการเหล่านี้ใช้ $PARTITION ฟังก์ชันและ ALTER PARTITION FUNCTION คําสั่ง
ข้อมูลพาร์ติชันแบบสอบถาม
คุณสามารถดูข้อมูลพาร์ติชันได้โดยใช้ $PARTITION ฟังก์ชัน ตัวอย่างมีดังนี้:
-- View partition information
SELECT
$PARTITION.PF_OrderDate(OrderDate) AS PartitionNumber,
MIN(OrderDate) AS MinDate,
MAX(OrderDate) AS MaxDate,
COUNT(*) AS RowCount
FROM Orders
GROUP BY $PARTITION.PF_OrderDate(OrderDate)
ORDER BY PartitionNumber;
เพิ่มขอบเขตพาร์ติชันใหม่
คุณสามารถแยกพาร์ติชันเพื่อเพิ่มค่าขอบเขตใหม่ได้โดยใช้ ALTER PARTITION FUNCTION. ตัวอย่างมีดังนี้:
-- Split partition to add new boundary
ALTER PARTITION FUNCTION PF_OrderDate()
SPLIT RANGE ('2024-11-01');
คําสั่งนี้เพิ่มค่าขอบเขตใหม่ (1 พฤศจิกายน 2024) ให้กับฟังก์ชันพาร์ติชัน โดยแยกพาร์ติชันที่มีอยู่ออกเป็นสองพาร์ติชัน พาร์ติชันที่มีวันที่ตั้งแต่เดือนตุลาคมถึงธันวาคมจะกลายเป็นสองพาร์ติชัน: พาร์ติชันหนึ่งสําหรับเดือนตุลาคมและอีกพาร์ติชันหนึ่งสําหรับเดือนพฤศจิกายนถึงธันวาคม
เก็บถาวรและลบพาร์ติชัน
คุณสามารถรวมพาร์ติชันเพื่อเก็บถาวรข้อมูลเก่าได้โดยใช้ ALTER PARTITION FUNCTIONMERGE RANGE. ตัวอย่างมีดังนี้:
-- Merge partitions to archive old data
ALTER PARTITION FUNCTION PF_OrderDate()
MERGE RANGE ('2023-12-31');
ใช้แนวทางปฏิบัติที่ดีที่สุดสําหรับการแบ่งพาร์ติชัน
การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดทั่วไปในการแบ่งพาร์ติชันที่ยากต่อการแก้ไขหลังจากการใช้งาน:
- จัดแนวดัชนีด้วยพาร์ติชันตาราง: ใช้โครงร่างพาร์ติชันเดียวกันสําหรับตารางและดัชนีเพื่อเปิดใช้งานการสลับและบํารุงรักษาพาร์ติชัน
- ตรวจสอบการกระจายข้อมูล: ตรวจสอบสถิติพาร์ติชันเป็นประจําเพื่อระบุพาร์ติชันที่ไม่สมดุลและตรวจสอบการกําจัดพาร์ติชัน
- การจัดการพาร์ติชันอัตโนมัติ: กําหนดเวลางานเพื่อเพิ่มพาร์ติชันใหม่ก่อนที่จะถึงขอบเขตและเก็บถาวรพาร์ติชันเก่า
- หลีกเลี่ยงการแบ่งพาร์ติชันมากเกินไป: กําหนดเป้าหมายหลายล้านแถวต่อพาร์ติชัน ไม่ใช่หลายพันพาร์ติชันสร้างค่าใช้จ่าย
- รวมคีย์พาร์ติชันในคีย์หลัก: จําเป็นสําหรับการจัดตําแหน่งดัชนีแบบคลัสเตอร์บนโครงร่างพาร์ติชัน
การแบ่งพาร์ติชันต้องมีการวางแผนอย่างรอบคอบ คีย์พาร์ติชันและการจัดตําแหน่งดัชนีที่คุณเลือกจะเป็นตัวกําหนดว่าคุณได้รับประสิทธิภาพหรือสร้างความซับซ้อน เมื่อนําไปใช้อย่างถูกต้องการแบ่งพาร์ติชันจะเปลี่ยนการจัดการตารางขนาดใหญ่ผ่านการสืบค้นที่เร็วขึ้นการเก็บถาวรที่มีประสิทธิภาพและการบํารุงรักษาที่ง่ายขึ้น