Sql-Server
SQL Server 2012 哪些情況下哪些索引效率更高
我使用 SQL Server 2012。
我想知道什麼時候我想知道在什麼情況下我必須使用
CREATE NONCLUSTERED COLUMNSTORE INDEX ....
,在什麼情況下我必須使用Create NonClustered Index... Include
,在什麼情況下我必須對Create NonClustered Index...
所有列使用。相對於其他有什麼優勢和劣勢
例子 :
Use [AdventureWorksDW2012] Go CREATE NONCLUSTERED COLUMNSTORE INDEX csi_FactResellerSales ON dbo.FactResellerSales (ProductKey, UnitPrice, CustomerPONumber, OrderDate); SELECT ProductKey, UnitPrice, CustomerPONumber, OrderDate FROM dbo.FactResellerSales;
Drop Index csi_FactResellerSales On [dbo].[FactResellerSales] Create NonClustered Index Ardalan On [dbo].[FactResellerSales] (ProductKey) include(UnitPrice, CustomerPONumber, OrderDate) SELECT ProductKey, UnitPrice, CustomerPONumber, OrderDate FROM dbo.FactResellerSales;
Drop Index Ardalan On [dbo].[FactResellerSales] Create NonClustered Index Ardalan1 On [dbo].[FactResellerSales] (ProductKey,UnitPrice, CustomerPONumber, OrderDate) SELECT ProductKey, UnitPrice, CustomerPONumber, OrderDate FROM dbo.FactResellerSales; Drop Index Ardalan1 On [dbo].[FactResellerSales]
我認為您已經走在正確的軌道上 - 我鼓勵您繼續嘗試不同的選項,並親自了解性能差異。但是,以下是我的想法:
列儲存索引
當您真正對列中的所有(或大部分)數據感興趣時,這些索引的性能非常好。如果您熱衷於查看列中數據的分佈,例如每個訂單的銷售數量或位置數據,那麼列儲存是訪問整個列的高性能方式。
寫入列儲存索引比寫入行慢。如果您有高速 OLTP 系統,我不會使用列儲存索引。如果您有興趣過濾到小型結果集,也可以避免使用列儲存索引。
覆蓋索引
當您有寬表和定期訪問表中少量列的查詢時使用這些索引。覆蓋索引是刪除聚集索引掃描、減少整體 IO 和提高並發性的絕佳方式。
覆蓋表中所有列的索引
從不。我看不出這樣做的充分理由。不過很高興得到糾正。也許……也許……仍然不相信……如果您正在實施過濾索引之類的東西,您可能會這樣做。這實際上會將您的表格分成離散的範圍。但我不相信這是一個好方法。