Clustered ColumnStore Index מגבלות והערות נוספות - ilDBA Portal

Clustered ColumnStore Index מגבלות והערות נוספות

04/09/2014 | פורסם על ידי

ה-Clustered ColumnStore Index הוא פיצ'ר נחמד של גרסה SQL Server 2014, אבל הוא מגיע עם כמה מגבלות ודברים ששווה לבדוק לפני שרצים לממש אותו. הנה כמה מהדברים האלה…

תמיכה ב- isolation levels

ל- SQL Server 6 isolation levels: Read Uncommitted, Read Committed, Repeatable Read, Serializable. 2 ה- Isolation Level הנותרים משתמשים ב- Row Versioning, מה שמאפשר לשאילתות לגשת למידע ללא נעילות. Isolation levels הללו הם:

  • Read Committed Snapshot (חלק מ Read Committed isolation).
  • Snapshot, שנקבע ברמת ה- DB.

כל ה- isolation levels נתמכים על ידי Clustered ColumnStore Index מלבד snapshot,שנקבע כאמור ברמת ה- DB. הנע קטע הקוד שמדגים זאת.

-- And what about the unsupported SNAPSHOT isolation level?
ALTER DATABASE [AdventureWorks2012] SET ALLOW_SNAPSHOT_ISOLATION ON
GO
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
begin tran;
--inserting 10 rows into table
INSERT INTO SalesOrders(OrderDate, SubTotal, SalesOrderNumber)
SELECT TOP 10
DATEADD(minute, ABS(a.object_id % 50000 ), CAST('2011-11-04'
AS DATETIME)),
ABS(a.object_id % 10),
CAST(ABS(a.object_id % 13) AS VARCHAR)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
commit;
ALTER DATABASE [AdventureWorks2012] SET ALLOW_SNAPSHOT_ISOLATION OFF;

הודעת השגיאה המתקבלת היא עבור snapshot isolation:

Msg 35371, Level 16, State 1, Line 151
SNAPSHOT isolation level is not supported on a table which has a clustered columnstore index.

תמיכה בעמודות מסוג sparse

החל מ- SQL 2008 עמודות עם הרבה ערכים של Null, יכולה להיות מאוחסנת כ – Sparse Column, על ידי ציון התכונה SPARSE לעמודות שהם nullable, בכדי לחסוך את התקורה של אחסון העמודות עם ערכי NULL. אי אפשר ליצור columnstore index על עמודה מסוג Sparse. הנה קטע הקוד המתאים:

use [AdventureWorks2012]
--If the orders table is already present, you can delete it, and then create new one with the name Orders
IF OBJECT_ID('SalesOrders', 'U') IS NOT NULL BEGIN
DROP TABLE SalesOrder
END
GO
--creating table for demo
CREATE TABLE SalesOrders(SalesOrdersID INT IDENTITY, OrderDate DATETIME,
SubTotal MONEY, SalesOrderNumber INT, DiscsNBR int SPARSE NULL,)
GO
 
--creating columnstore index
CREATE CLUSTERED COLUMNSTORE INDEX
idx_columnstore_SalesOrderNumber
ON SalesOrders
GO

הודעת השגיאה שנקבל:

Msg 35309, Level 16, State 1, Line 25
CREATE INDEX statement failed because a columnstore index cannot be created on a sparse column. Consider creating a nonclustered columnstore index on a subset of columns that does not include any sparse columns.

בדיקה אם סוגי הנתונים בעמודות מתאימים ל columnstore index

ה- script הבא מ http://www.patrickkeisler.com/search/label/Columnstore בודק אם סוגי הנתונים בעמודות יכולות להיות מוכלות ב columnstore index.

-- Columnstore Table Analyzer
-- Source:
-- Find columns in user tables that cannot be included in a columnstore index.
-- These restrictions apply to both clustered and non-clustered columnstore indexes.
-- SQL Server 2014: http://msdn.microsoft.com/en-us/library/gg492153(v=sql.120).aspx
-- SQL Server 2012: http://msdn.microsoft.com/en-us/library/gg492153(v=sql.110).aspx
 
 
-- This section is only for SQL Server 2014
BEGIN
 SELECT
 s.name AS 'SchemaName'
,o.name AS 'TableName'
,c.name AS 'ColumnName'
,'ColumnType' = CASE t.name
 WHEN 'varchar' THEN
 CASE c.max_length
 WHEN -1 THEN 'varchar(max)'
 ELSE 'varchar(' + CONVERT(VARCHAR,c.max_length) + ')'
 END
 WHEN 'nvarchar' THEN
 CASE c.max_length
 WHEN -1 THEN 'nvarchar(max)'
 ELSE 'nvarchar(' + CONVERT(VARCHAR,c.max_length) + ')'
 END
 ELSE t.name
 END
,'ColumnAttribute' = CASE
 WHEN (c.is_filestream = 1) THEN 'Filestream'
 WHEN (c.is_sparse = 1) THEN 'Sparse'
 ELSE ''
 END
 FROM sys.columns c
 JOIN sys.objects o ON c.object_id = o.object_id
 JOIN sys.types t ON c.user_type_id = t.user_type_id
 JOIN sys.schemas s ON o.schema_id = s.schema_id
 WHERE o.is_ms_shipped <> 1
 -- These types cannot be part of a SQL Server 2014 columnstore index
 AND(
 t.name IN
 ('ntext'
,'text'
,'image'
,'rowversion'
,'timestamp'
,'sql_variant'
,'hierarchyid'
,'geography'
,'geometry'
,'xml')
 OR(
 -- Varchar(max) and nvarchar(max)
 t.name IN('varchar','nvarchar')
 AND c.max_length = -1)
 OR(
 -- Filestream
 c.is_filestream = 1)
 OR(
 -- Sparse
 c.is_sparse = 1)
 )
 ORDER BY s.name,o.name,c.column_id
END
 
/*
Running this against your database will output an organized list of tables along with the column name and data type that cannot be used within a Columnstore index.
*/
The following two tabs change content below.

דוד יצחק

דוד יצחק , DBA אפליקטיבי ותשתיתי של SQL Server, Oracle ,Sybase Anywhere מזה 17 שנה עם התמחות בשיפור ביצועים, שרידות, זמינות גבוהה, רפלקציה, תוספים גיאוגרפיים, אבטחת מידע ו-Business Intelligence. הוא מרכז את פורום DBA צפון של ilOUG ומרצה בפורום משתמשי SQL Server.

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

בדיקת ביצועים של Clustered ColumnStore Index

במאמרים הקודמים דיברנו על איך משתמשים ב-Clustered ColumnStore Index, במאמר זה נשחק קצת עם הביצועים שלו לשם ההתרשמות. כדי לבצע את זה, ניצור 3 טבלאות על פי הבא: SalesOrders_Clustered- עם cluster index על השדה SalesOrderNumber. [...]

עבודה עם Clustered ColumnStore Index

במאמר זה נדבר על העבודה המעשית עם ה-Clustered ColumnStore Index (CCI). נסביר איך יוצרים אותו על חלק מהעמודות, נדבר על Catalog Views ואיך מתחזקים את ה-index. יצירה של CCI על חלק מהעמודות כל העמודות חיבות להיות מוכלות ב CCI [...]

Updateable Clustered ColumnStore Index – אשליה או אמת?

ה-Clustered ColumnStore Index (CCI) הם סוג של אשליה של SQL 2014 מכוון שהאינדקסים הם לא באמת ברי עדכון on the fly. אומנם אנחנו יכולים לעדכן את הנתונים בזמן אמת וזה בהחלט feature חדש עם הרבה אפשרויות, אבל יש להבין את המימוש [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: