۱۴۰۴/۰۷/۰۴ Nebular

Columnstore Index

Columnstore Index چیست؟

به طور پیش‌فرض در SQL Server داده‌ها در Rowstore ذخیره می‌شن (یعنی ردیفی).

  • هر ردیف (Row) شامل همه ستون‌هاست.
  • مناسب برای عملیات OLTP (تراکنشی: Insert/Update/Delete زیاد).

ولی در Columnstore Index داده‌ها به صورت ستونی ذخیره می‌شن:

  • هر ستون جداگانه ذخیره و فشرده‌سازی می‌شه.
  • خیلی بهینه برای عملیات OLAP (تحلیلی/گزارش‌گیری روی حجم زیاد داده).

2️⃣ تفاوت Rowstore vs Columnstore

فرض کن جدولی داری با 1 میلیون رکورد و 20 ستون.
می‌خوای فقط مجموع Amount رو حساب کنی:

SELECT SUM(Amount) FROM Sales;
  • در Rowstore → باید کل جدول (همه ستون‌ها) خونده بشه، حتی اگه فقط 1 ستون لازم باشه.
  • در Columnstore → فقط ستون Amount خونده می‌شه → خیلی سریع‌تر و کم‌مصرف‌تر.

3️⃣ انواع Columnstore Index

✅ Clustered Columnstore Index (CCI)

  • داده‌های جدول به صورت ستونی ذخیره می‌شن.
  • کل جدول با فرمت Columnstore نگهداری می‌شه.
  • مناسب برای Data Warehouse یا جداول خیلی بزرگ.

مثال:

CREATE CLUSTERED COLUMNSTORE INDEX CCI_Sales
ON Sales;

📌 اینجا جدول Sales دیگه Rowstore نیست → کل داده‌ها به صورت ستونی ذخیره شدن.


✅ Non-Clustered Columnstore Index (NCCI)

  • مثل ایندکس معمولی، به صورت جداگانه ساخته می‌شه.
  • داده‌های جدول اصلی همچنان Rowstore هستن، ولی یک نسخه ستونی برای Queryهای تحلیلی ساخته می‌شه.

مثال:

CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_Sales
ON Sales(Amount, SaleDate);

📌 اینجا جدول اصلی دست‌نخورده می‌مونه، ولی برای Amount و SaleDate ایندکس ستونی ایجاد می‌شه.


4️⃣ مزایای Columnstore Index

  • 🚀 سرعت بالا در Queryهای تحلیلی (Aggregate, Group By, Join روی داده‌ی بزرگ).
  • 📦 فشرده‌سازی بالا (تا 10 برابر فضای کمتر).
  • 📊 عالی برای سناریوهای Data Warehouse و BI.

5️⃣ معایب / محدودیت‌ها

  • عملیات Insert/Update/Delete کمی کندتره (چون داده‌ها باید به صورت ستونی بازآرایی بشن).
  • برای جداول کوچک کارایی زیادی نداره.
  • بعضی قابلیت‌ها محدودیت دارن (مثلاً روی Columnstore Index نمی‌تونی همه نوع Constraint بذاری).

6️⃣ سناریوی واقعی

تصور کن یک جدول Sales داری با 100 میلیون رکورد:

SELECT CustomerID, SUM(Amount) 
FROM Sales
GROUP BY CustomerID;
  • با Rowstore: ممکنه چند ثانیه یا دقیقه طول بکشه.
  • با Columnstore: چون فقط ستون‌های CustomerID و Amount لود می‌شن و بقیه ستون‌ها اصلاً نیازی نیست → چند برابر سریع‌تر می‌شه.

📌 جمع‌بندی

  • Rowstore (پیش‌فرض): داده‌ها ردیفی ذخیره می‌شن → خوب برای OLTP.
  • Columnstore Index: داده‌ها ستونی ذخیره می‌شن → خوب برای OLAP (تحلیل حجم بالا).
  • Clustered Columnstore Index: کل جدول ستونی ذخیره می‌شه.
  • Non-Clustered Columnstore Index: فقط روی ستون‌های خاص نسخه ستونی ساخته می‌شه.
Accept Cookies
Accept Cookies
[your-shortcode]