جداول التقسيم للمقياس

مكتمل

قرارات التقسيم شبه دائمة. مفتاح التقسيم المختار بشكل سيء يجعل الأداء أسوأ من جدول غير مقسيم، وإعادة تقسيم جدول متعدد التيرابايت يتطلب إعادة بنائه بالكامل مع ساعات من التوقف. مفتاح التقسيم ومحاذاة الفهرس التي تختارها أثناء التصميم تحددان ما إذا كان التقسيم يحسن نظامك أم يخلق مشاكل صيانة لا يمكنك التراجع عنها بسهولة.

تقسيم الجداول يقسم الجداول الكبيرة إلى أجزاء أصغر وأكثر قابلية للإدارة (تقسيمات) مع الحفاظ عليها كجدول منطقي واحد. يرى تطبيقك جدولا واحدا، لكن محرك قاعدة البيانات يدير عدة مقاطع مادية يمكن صيانتها أو أرشفتها أو الاستعلام عنها بشكل مستقل.

فهم مفاهيم التقسيم

يتضمن التقسيم عدة مكونات رئيسية: دالة تقسيم تحدد كيفية تقسيم البيانات، مخطط تقسيم يربط الأقسام بمجموعات الملفات، وعمود التقسيم الذي يحدد أي قسم ينتمي إليه كل صف. فهم هذه المفاهيم يساعدك على تصميم استراتيجية تقسيم فعالة.

تقييم الأداء والفوائد التشغيلية

يوفر التقسيم تحسينات في أداء الاستعلامات من خلال إزالة الأقسام حيث يتم تصفية الاستعلامات حسب الوصول إلى مفاتيح القسم فقط في الأقسام ذات الصلة (شهر واحد بدلا من 120 شهرا)، والمعالجة المتوازية حيث تتم معالجة عدة أقسام في نفس الوقت عبر أنوية وحدة المعالجة المركزية، وإحصائيات أسرع محسوبة لكل قسم بدلا من الجدول بأكمله، والبحث عن الفهرس حيث تعني الأقسام الصغيرة أشجار B أقل ضحالا.

تشمل الفوائد التشغيلية الصيانة الدقيقة حيث تعيد بناء الفهارس على القسم الحالي بينما تبقى الأقسام القديمة متصلة، والأرشفة السريعة عن طريق تحويل الأقسام القديمة إلى جداول أرشفة في ثوان عبر عمليات البيانات الوصفية، وتحسين التوفر من خلال صيانة الأقسام بشكل مستقل، والتخزين الطبقي بنقل الأقسام القديمة إلى تخزين أرخص وأبطأ.

على سبيل المثال، تخيل شركة خدمات مالية لديها جدول معاملات بحجم 1.2 تيرابايت حيث تقوم الاستعلامات بتصفية حسب التاريخ (90% من الاستعلامات) بمسح الجدول بالكامل. بعد تنفيذ التقسيم الشهري، يتحسن أداء الاستعلام بمقدار 10-20 مرة من خلال إزالة الأقسام، وإعادة بناء الفهرس تنتقل من 6 ساعات إلى 20 دقيقة لكل قسم، وأرشفة البيانات القديمة تقلل من أقفال مدتها أربع ساعات إلى ثوان باستخدام تبديل الأقسام، وتنخفض تكاليف التخزين 40% عن طريق نقل الأقسام القديمة إلى تخزين أرخص.

فهم متى تستخدم التقسيم

يوضح الجدول التالي متى يساعد التقسيم مقابل عندما يضيف تعقيدا غير ضروري:

السيناريو استخدام تقسيم المناطق؟ لماذا
تصفية الاستعلامات على عمود محدد (تاريخ، منطقة) 80%+ من الوقت ‏‏نعم‬ إزالة الأقسام تصل فقط إلى الأقسام ذات الصلة
أرشفة منتظمة للبيانات القديمة (شهرية، ربع سنوية) ‏‏نعم‬ تبديل الأقسام في ثوان بدلا من DELETE العمليات
يجب إعادة بناء الفهارس فقط على البيانات الحديثة ‏‏نعم‬ أعد بناء القسم الحالي بينما تبقى الأقسام القديمة متصلا بالإنترنت
جداول كبيرة (متعددة التيرابايت) مع احتياجات تخزين متدرجة ‏‏نعم‬ نقل الأقسام القديمة إلى تخزين أرخص
معظم الاستعلامات تقوم بمسح الجدول الكامل أو المرشح على أعمدة مختلفة لا تم مسح جميع الأقسام — أداء أسوأ من غير المقسم
البحث في صف واحد أو مسح المدى الصغير شائع لا التقسيم يضيف عبئا إضافيا دون فوائد
لا يوجد عمود واضح يتوافق مع أنماط الاستعلام لا لا أستطيع اختيار مفتاح تقسيم فعال

أنشئ مكونات تقسيم

المثال التالي يوضح المكونات الثلاثة: دالة التقسيم، مخطط التقسيم، والجدول المقسم:

-- 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. يقوم مخطط التقسيم بربط جميع الأقسام بمجموعة الملفات الأساسية. يستخدم جدول الأوامر عمود OrderDate كمفتاح تقسيم، والذي يجب تضمينه في المفتاح الأساسي لمحاذاة الفهرس بشكل صحيح.

اختر استراتيجيات التقسيم

مفتاح التقسيم هو قرارك الأهم. اختر بشكل سيء، والتقسيم يضر أكثر مما يساعد. يظهر مفتاح القسم المثالي في WHERE جملة معظم الاستعلامات، وينشئ تقسيمات متوازنة بشكل معقول، ويتوافق مع أنماط الصيانة لديك.

معايير اختيار المفاتيح التالية تساعدك في اختيار مفتاح التقسيم المناسب:

  • أنماط الاستعلام: 80%+ من الاستعلامات يتم تصفية بواسطة هذا العمود
  • توزيع البيانات: توزيع متساو عبر الأقسام (لا يوجد قسم واحد يحتوي على 90% من البيانات)
  • محاذاة الصيانة: تطابق أنماط الأرشيف/التطهير (أعمدة التاريخ للأرشفة القائمة على الوقت)
  • الاستقرار: القيمة لا تتغير بعد الإدراج (تجنب التقسيم على الأعمدة القابلة للتحديث)

فهم تقسيم المدى

تقسيم النطاق يقسم البيانات بناء على نطاقات القيم—وغالبا ما تكون التواريخ. كل قسم يحتوي على نطاق محدد (بيانات يناير، بيانات فبراير، إلخ). هذه هي الاستراتيجية الأكثر استخداما.

هنا يعمل تقسيم النطاق بشكل أفضل:

  • بيانات السلاسل الزمنية (الأوامر، السجلات، المعاملات)
  • البيانات التسلسلية (أرقام الفواتير، معرفات الطلبات)
  • النطاقات الرقمية (نطاقات الرواتب، مستويات الأسعار)

يوضح الجدول التالي أنماط التقسيم الشائعة:

النمط متى تستخدم
يوميًا أنظمة عالية الحجم، واحتفاظ قصير
أسبوعيًا حجم متوسط، احتفاظ لمدة 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);

تنفيذ تقسيم الفهرس

عند تقسيم جدول، يمكن أن تكون الفهارس محاذاة أو غير محاذاة. تستخدم الفهارس المحاذفة نفس مخطط التقسيم في الجدول، بينما الفهارس غير المحاذية تستخدم تقسيما مختلفة أو لا تقسيم. افتراضيا، ترث الفهارس غير المجمعة على الجداول المقسمة مخطط تقسيم الجدول.

فهم الفهارس التوافقية مقابل غير المنتزازة

تستخدم الفهارس المحاذفة نفس دالة التقسيم التي تستخدم الجدول. كل قسم فهرس يطابق قسم الجدول، مما يتيح تبديل الأقسام بسرعة، وصيانة مبسطة، وإزالة أفضل للأقسام.

الفهارس غير المحاذية تستخدم تقسيمات مختلفة أو لا تقسيمات. لا يمكنها استخدام تبديل الأقسام ولا تدعم على الجداول التي تحتوي على أكثر من 1000 قسم.

استخدم الفهارس المحازمة عندما تحتاج إلى تبديل الأقسام للأرشفة، أو تريد إعادة بناء أقسام محددة بشكل مستقل، أو عندما تقوم أنماط الاستعلام بتصفية على مفتاح الأقسام.

على سبيل المثال، تخيل جدول أوامر مقسم بواسطة 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 FUNCTION .MERGE RANGE إليك مثال:

-- Merge partitions to archive old data
ALTER PARTITION FUNCTION PF_OrderDate()
    MERGE RANGE ('2023-12-31');

تطبيق أفضل ممارسات التقسيم

اتباع أفضل الممارسات يساعدك على تجنب الأخطاء الشائعة في التقسيم التي يصعب تصحيحها بعد التنفيذ:

  • محاذاة الفهارس مع أقسام الجدول: استخدم نفس مخطط التقسيم للجداول والفهارس لتمكين تبديل الأقسام وصيانتها
  • مراقبة توزيع البيانات: تحقق من إحصائيات الأقسام بانتظام لتحديد الأقسام غير المتوازنة والتحقق من إزالة الأقسام
  • أتمتة إدارة الأقسام: جدولة المهام لإضافة أقسام جديدة قبل الوصول إلى الحدود وأرشفة الأقسام القديمة
  • تجنب التقسيم الزائد: استهدف ملايين الصفوف لكل قسم، وليس آلاف الصفوف — كثرة الأقسام تخلق عبئا إضافيا
  • تضمين مفتاح القسم في المفتاح الأساسي: مطلوب لمحاذاة الفهرس المجمعة على مخطط التقسيم

يتطلب التقسيم تخطيطا دقيقا. مفتاح التقسيم ومحاذاة الفهرس التي تختارها تحدد ما إذا كنت ستحصل على الأداء أو تخلق تعقيدا. عند تنفيذه بشكل صحيح، يحول التقسيم إدارة الجداول الكبيرة من خلال استعلامات أسرع، وأرشفة فعالة، وصيانة مبسطة.