我使用 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 和提高并发性的绝佳方法。
覆盖表所有列的索引
从不。我看不出这样做的充分理由。不过很高兴得到纠正。也许......也许......仍然不相信......如果你正在实施类似过滤索引的东西,你可能会这样做。这基本上会将您的表格分成离散的范围。但我不相信这是一个好方法。