為什麼不在每個表上創建 ColumnStore 索引?
由於 ColumnStore 索引提高了數據倉庫數據庫的性能,而且自 SQL 2104 起,它也是可更新的,為什麼不在每個表上創建 ColumnStore 索引呢?
**編輯:**在 SQL 2014 中,如果有 CLUSTERED ColumnStore 索引,我們就不能有任何其他索引。SQL 2016 中消除了此限制,因此我的問題可能與 SQL 2016 更相關。
在 SQL Server 2016 中,如果您擁有並處理超過數百萬行,那麼唯一不允許您使用列儲存索引的將是目前的技術限制,例如 CCI、CLR、CDC 或 CT over CCI 上的複制等…否則,這應該是處理任何現代數據倉庫的預設方式。
為什麼?因為表現會很糟糕。
Microsoft 行銷文獻是為了讓人們購買產品,而不是讓您閱讀每一行並相信這正是該產品在各種情況下的工作方式。因此,當您看到有關磁碟空間減少和 40 倍 IMOLTP 速度增加的精彩聲明時,您的警鐘就應該響起。
這不是說他們在撒謊或其他什麼。CS 和 IMOTLP 非常適合他們用作案例研究的極其具體的利基案例。只是這些好處不會轉化為非利基案例。
免責聲明:我不是像 Niko 這樣的 CS 專家,IMOLTP 也是如此。我不致力於具有毫秒延遲的大規模並發高性能。我只是一個普通的DBA。
但我確實嘗試在我今年早些時候從事的一個小型報告數據庫項目中實現它們,因為我有機會並且認為它可能會給巨大的 10 倍磁碟 40 倍 CPU 帶來好處。
在我的初始結構啟動並執行,並轉換為 IMOLTP 和後來的 CS 後,我看到性能全面下降,很大。我花了一兩個星期閱讀文件並調整設置,但最終 b-trees 是最快的。
我想像 IMOLTP 將提供 10-40 倍的性能提升,因為數據保存在記憶體中並採用不同的結構。然而事實證明,對於無論如何都將在緩衝池中的小表來說,這並沒有任何區別。這些好處僅來自高並發性或使用本機過程(我做不到,我的邏輯是 6-7 個嵌套 CTE 和許多視窗函式)。
我以為我也可以從 CS 中獲得性能,但事實證明它們在範圍掃描方面很糟糕,正如他們在文件中某處所說的那樣,如果你正在做報告或分析,那麼這些就相當糟糕了常見的。
所以是的,它們不是任何東西的替代品,有時閱讀是不夠的。做你自己的測試並形成你自己的一些結論。