دليل معماري

فهارس Columnstore في SQL Server: الدليل العملي

يمكن لـ columnstore أن يغير الأحمال التحليلية الكبيرة، لكنه ليس بديلاً عامًا لتصميم rowstore. السؤال المهم ليس ما إذا كان columnstore حديثًا. السؤال المهم هو ما إذا كانت الجدول وأنماط الوصول تبرر مقايضاته.

لماذا يبدو columnstore كصندوق أسود

تتعرف كثير من الفرق على columnstore من خلال benchmark أو مشروع warehouse ناجح ثم تبالغ في تعميمه. يتفوق columnstore في ضغط مجموعات البيانات الكبيرة ومسح أعداد كبيرة من الصفوف بسرعة للأعمال التحليلية. لكنه أقل جاذبية لعمليات singleton lookups أو مسارات OLTP الضيقة أو الجداول الصغيرة التي لا تصل إلى حجم كافٍ للاستفادة من التنسيق.

تأطير مهم: يمكن لـ clustered columnstore أن يحل محل تخطيط clustered rowstore في بعض الجداول التحليلية الثقيلة، لكن فرض المفتاح الأساسي قد يظل بحاجة إلى فهرس rowstore من نوع nonclustered.

????? ??? ????? Columnstore

????? ??? ??????? ????? ?????? ??? ??????? columnstore ?? ??? clustered ? nonclustered? ???????? ??? ??? DMV ???? ?????? ??? ????? ????????.

????? clustered columnstore index ??? ???? fact

sql

??? ?? ????? ????????? ?????? warehouse ????? ????? scans ? aggregations ??? ??? ?????.

CREATE TABLE dbo.FactSales
(
    SalesKey bigint NOT NULL,
    OrderDateKey int NOT NULL,
    CustomerKey int NOT NULL,
    ProductKey int NOT NULL,
    Quantity int NOT NULL,
    NetAmount decimal(18,2) NOT NULL
);

CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSales
ON dbo.FactSales;

????? nonclustered columnstore index ??? ???? rowstore

sql

???? ??? ????? ????? ??? ???? OLTP ??????? ??? rowstore? ????? ?????? ???????? ?? ????? ?????? ?????.

CREATE TABLE dbo.SalesOrderDetail
(
    SalesOrderDetailID bigint NOT NULL PRIMARY KEY,
    SalesOrderID bigint NOT NULL,
    ProductID int NOT NULL,
    OrderQty int NOT NULL,
    UnitPrice money NOT NULL,
    ModifiedDate datetime2 NOT NULL
);

CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrderDetail_Analytics
ON dbo.SalesOrderDetail (SalesOrderID, ProductID, OrderQty, UnitPrice, ModifiedDate);

?????? ??? rowgroups ??? ????? ????????

sql

???? columnstore ????? ??? ???? rowgroups? ???? ??? ??? ???? ??????.

SELECT
    OBJECT_NAME(object_id) AS table_name,
    row_group_id,
    state_desc,
    total_rows,
    deleted_rows,
    size_in_bytes / 1024.0 / 1024.0 AS size_mb
FROM sys.dm_db_column_store_row_group_physical_stats
WHERE object_id = OBJECT_ID('dbo.FactSales')
ORDER BY row_group_id;

أين يناسب كل نموذج فهرسة

Clustered columnstore

مناسب للجداول الكبيرة الشبيهة بـ fact والمهيمن عليها scans و aggregations والأحمال التحليلية التي تستفيد من الضغط، عندما لا يكون الوصول المعاملاتي صفًا بصف هو المسار الأساسي.

Nonclustered columnstore

مفيد عندما تحتاج الجدول إلى سلوك rowstore للوصول المعاملاتي الرئيسي، لكن الاستعلامات التحليلية يمكن أن تستفيد من إسقاط مضغوط إضافي.

Rowstore التقليدي

لا يزال الخيار الافتراضي الصحيح للعديد من جداول OLTP التي تعتمد على predicates انتقائية و singleton lookups و updates كثيفة أو زمن استجابة معاملي متوقع.

أنماط تصميم عملية

جداول fact التحليلية

  • - فكر في clustered columnstore عندما تهيمن scans و aggregations
  • - اربط مسارات التحميل و partitioning بحركة البيانات والاحتفاظ بها
  • - قِس جودة rowgroups والضغط بعد تحميلات حقيقية لا في staging فقط

الجداول المختلطة بين التشغيل والتقارير

  • - أبقِ rowstore كمسار الوصول الرئيسي عندما تظل lookups المعاملاتية حرجة
  • - أضف nonclustered columnstore بشكل انتقائي لتسريع التقارير
  • - تحقق من overhead الكتابة وتأثير الصيانة قبل توسيع النمط

تخطيط دورة الحياة والصيانة

  • - راجع partitioning وأحجام الدُفعات وسلوك الأرشفة معًا
  • - أكد أن استراتيجية الفهارس ما زالت تدعم القيود والاستعلامات التشغيلية
  • - تعامل مع columnstore كجزء من تصميم الجدول وليس كمفتاح tuning معزول

أخطاء شائعة مع columnstore

استخدام columnstore على جداول صغيرة

إذا كان الجدول صغيرًا جدًا فلن يحقق المحرك تقريبًا فوائد ملموسة من الضغط أو المسح. تزداد التعقيد بينما يبقى العائد محدودًا.

نسيان مسارات الوصول النقطية

الجدول الذي يخدم lookups ساخنة أو seeks انتقائية جدًا غالبًا ما يحتاج إلى تصميم rowstore-first حتى لو وُجدت استعلامات تقارير أيضًا.

تجاهل أنماط التحميل

أحجام دفعات سيئة أو حركة partitions غير ملائمة أو أنماط كتابة كثيفة يمكن أن تضعف rowgroups وتمحو النتيجة التي كان الفريق يتوقعها.

تعامل مع columnstore كقرار workload

يكون columnstore قويًا عندما يتصرف الجدول كأصل تحليلي: كثير من الصفوف، قيمة عالية للضغط، scans كبيرة، ومسارات وصول تعتمد على aggregations. وهو ليس أفضل تلقائيًا لمجرد أنه أحدث أو لأن benchmark واحد فضله.

يبدأ التصميم الصحيح من أنماط الوصول لا من التصنيفات التسويقية. إذا كانت معظم الاستعلامات معاملاتية وانتقائية، يبقى rowstore الخيار الأكثر أمانًا. وإذا كان الجدول يتصرف كـ fact table، فإن columnstore يستحق تقييمًا جديًا.

الأسئلة الشائعة

متى يجب استخدام clustered columnstore في SQL Server؟

غالبًا ما يكون الأنسب على الجداول التحليلية الكبيرة أو جداول warehouse حيث تهيمن scans و aggregations ولا تكون lookups المعاملاتية هي الحمل الرئيسي.

هل يمكن لفهرس columnstore أن يحل محل clustered index للمفتاح الأساسي؟

يمكن لـ clustered columnstore أن يحل محل تخطيط clustered rowstore في بعض الجداول، لكن فرض المفتاح الأساسي قد يظل بحاجة إلى فهرس rowstore nonclustered.

هل columnstore أفضل من rowstore لـ OLTP؟

غالبًا لا كقاعدة عامة. يظل rowstore التقليدي هو الافتراضي الأفضل لكثير من جداول OLTP بسبب lookups الانتقائية و updates المتكررة وأنماط الوصول المعاملاتية المتوقعة.

© 2026 - Ryware.