מדריך ארכיטקטורה

אינדקסי Columnstore ב-SQL Server: מדריך מעשי

Columnstore יכול לשנות עומסים אנליטיים גדולים, אך הוא אינו מחליף אוטומטית תכנון rowstore. השאלה החשובה אינה האם columnstore מודרני. השאלה החשובה היא האם הטבלה ודפוסי הגישה מצדיקים את הפשרות שלו.

למה columnstore מרגיש כמו קופסה שחורה

צוותים רבים פוגשים columnstore דרך benchmark או פרויקט warehouse מוצלח ואז מכלילים אותו רחוק מדי. Columnstore מצוין בדחיסת datasets גדולים ובסריקה מהירה של הרבה שורות עבור אנליטיקה. הוא פחות מתאים ל-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 התלויות בפרדיקטים סלקטיביים, singleton lookups, updates תכופים או latency טרנזקציוני צפוי.

דפוסי תכנון מעשיים

טבלאות fact אנליטיות

  • - שקלו clustered columnstore כאשר scans ו-aggregations דומיננטיים
  • - יישרו נתיבי טעינה ו-partitioning עם תנועת הנתונים ושימורם
  • - מדדו איכות rowgroups ודחיסה לאחר טעינות אמיתיות ולא רק ב-staging

טבלאות משולבות תפעול ודיווח

  • - השאירו rowstore כנתיב הגישה הראשי כאשר lookups טרנזקציוניים עדיין קריטיים
  • - הוסיפו nonclustered columnstore באופן סלקטיבי להאצת reporting
  • - אמתו overhead כתיבה והשפעת תחזוקה לפני הרחבת הדפוס

תכנון מחזור חיים ותחזוקה

  • - בדקו partitioning, גדלי batches וארכוב יחד
  • - ודאו שאסטרטגיית האינדקסים עדיין תומכת ב-constraints ובשאילתות תפעוליות
  • - התייחסו ל-columnstore כחלק מתכנון הטבלה ולא כ-switch מבודד של tuning

טעויות נפוצות עם columnstore

שימוש ב-columnstore על טבלאות קטנות

אם הטבלה קטנה מדי, המנוע כמעט ואינו מממש יתרונות של דחיסה וסריקה. המורכבות עולה והערך נשאר שולי.

שכחת נתיבי גישה נקודתיים

טבלה שמשרתת lookups חמים או seeks מאוד סלקטיביים עדיין דורשת לעיתים קרובות תכנון rowstore-first, גם אם קיימות גם שאילתות דיווח.

התעלמות מדפוסי טעינה

גדלי batch גרועים, תנועת partition לא נוחה או דפוסי כתיבה כבדים עלולים לפגוע ב-rowgroups ולמחוק את השיפור המצופה.

התייחסו ל-columnstore כהחלטת workload

Columnstore חזק כאשר הטבלה מתנהגת כנכס אנליטי: הרבה שורות, ערך דחיסה, scans גדולים ונתיבי גישה שמבוססים על אגרגציות. הוא לא אוטומטית טוב יותר רק מפני שהוא חדש יותר או מפני ש-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.