2024年11月25日 星期一

叢集資料行存放區索引:在資料表中強制執行唯一性條件約束



SQL Server 從SQL Server 2014 開始引入了「可更新」叢集資料行存放區索引(CCI),可將分析速度提高高達100 倍的數量級,同時顯著減少儲存空間(通常為10 倍)。您的里程會有所不同。
Microsoft SQL Server 團隊強烈建議對較大表(> 100 萬行)的資料倉儲使用 CCI。 資料倉儲的典型建議部署是對事實資料表使用 CCI,對維度資料表使用傳統資料行儲存。但是,
你應該考慮對維度資料表使用 CCI,尤其是現在 SQL Server 2016 支援建立一個或多個傳統 btree 索引以實現高效的相等和較短的範圍搜尋。



關於
叢集資料行存放區索引 (CCI),需要了解的一件有趣的事情是它沒有「關鍵」列,且行沒有排序。從這個角度來看,「叢集」這個詞可能有點令人困惑,
但其目的是將 CCI 指定為資料的「主」副本。如果有幫助的話,您可以將 CCI 視為以「列儲存格式」儲存資料的「堆疊」。

SQL Server 2014 中 CCI 的挑戰之一是沒有直接的方法來強制執行唯一性約束。你可以使用實體化檢視表(也就是 index view)以迂迴的方式強制執行唯一性,如此處的範例 所示 
當你建立CCI 時,它繼承了現有的 NCI。在我們的例子中,NCI 用於唯一性 
您可以看到這更加簡單和直觀。


create table t_account (
accountkey                 int not null,
accountdescription         nvarchar (50),
accounttype                nvarchar(50),
AccountCodeAlternatekey    int)
-- create CCI on it
CREATE CLUSTERED COLUMNSTORE index ACCOUNT_CI on t_account
drop view dbo.myview_t_account
go


create view dbo.myview_t_account with schemabinding
as select accountkey,accounttype, accountcodealternatekey
from dbo.t_account
go


-- create a materialized view
create unique clustered index clix_myview_t_account on myview_t_account (accountkey)
insert into t_account values (1, 'hello', 'hello', 1)
-- now insert a row with duplicate key which will fail due to uniqueness violation
insert into t_account values (1, 'hello', 'hello', 2)
-- Msg 2601, Level 14, State 1, Line 36
-- Cannot insert duplicate key row in object 'dbo.myview_t_account'
-- with unique index 'clix_my_t_account'. The duplicate key value is (1).
-- The statement has been terminated.


-- create the table. Unique constraint defaults to NCI


create table t_account (
accountkey                 int not null,
accountdescription   nvarchar (50),
accounttype                nvarchar(50),
unitsold                 int,
CONSTRAINT uniq_account UNIQUE (AccountKey)
)




CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account

--Test the unique key:
insert into t_account values (1,1,1,1)
insert into t_account values (1,2,2,2)


Msg 2627, Level 14, State 1, Line 22
Violation of UNIQUE KEY constraint 'uniq_account'. Cannot insert duplicate key in object 'dbo.t_account'. The duplicate key value is (1).

The statement has been terminated.

0 意見:

張貼留言