Sql-Server

SQL Server 2012 哪些情況下哪些索引效率更高

  • December 6, 2014

我使用 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 和提高並發性的絕佳方式。

覆蓋表中所有列的索引

從不。我看不出這樣做的充分理由。不過很高興得到糾正。也許……也許……仍然不相信……如果您正在實施過濾索引之類的東西,您可能會這樣做。這實際上會將的表格分成離散的範圍。但我不相信這是一個好方法。

引用自:https://dba.stackexchange.com/questions/84395