אינדקסי 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 ראוי לבחינה רצינית.
מאמרי SQL Server קשורים
השתמשו במדריך הביצועים ליסודות tuning ובמדריך השירותים לכיסוי תפעולי.
שאלות נפוצות
מתי כדאי להשתמש ב-clustered columnstore ב-SQL Server?
בדרך כלל הוא מתאים במיוחד לטבלאות אנליטיות או warehouse גדולות שבהן scans ו-aggregations דומיננטיים ו-lookups טרנזקציוניים אינם העומס המרכזי.
האם אינדקס columnstore יכול להחליף clustered index של מפתח ראשי?
Clustered columnstore יכול להחליף את פריסת ה-clustered rowstore בחלק מהטבלאות, אך אכיפת המפתח הראשי עדיין עשויה לדרוש אינדקס rowstore nonclustered.
האם columnstore טוב יותר מ-rowstore עבור OLTP?
בדרך כלל לא ככלל גורף. Rowstore מסורתי נשאר ברירת המחדל הטובה יותר עבור טבלאות OLTP רבות בגלל lookups סלקטיביים, updates תכופים ודפוסי גישה טרנזקציוניים צפויים.