4

我试图查看列存储索引可以在表上提供的那种性能提升。该表大约有 370 万行、11 列,并存储为堆(即没有主键)。我在表上创建一个列存储索引并运行以下查询:

SELECT 
    [Area], [Family],
    AVG([Global Sales Value]) AS [Average GlobalSalesValue],
    COUNT([Projected Sales])
FROM 
    dbo.copy_Global_Previous5FullYearSales
WHERE 
    [Year] > 2012  
GROUP BY 
    [Area], [Family]

创建表语句如下:

CREATE TABLE [dbo].[copy_Global_Previous5FullYearSales]
(
    [SBU] [NVARCHAR](10) NULL,
    [Year] [INT] NULL,
    [Global Sales Value] [MONEY] NULL,
    [Area] [NVARCHAR](50) NULL,
    [Sub Area] [NVARCHAR](50) NULL,
    [Projected Sales] [MONEY] NULL,
    [Family] [NVARCHAR](50) NULL,
    [Sub Family 1] [NVARCHAR](50) NULL,
    [Sub Family 2] [NVARCHAR](50) NULL,
    [Manufacturer] [NVARCHAR](40) NULL,
    [rowguid] [UNIQUEIDENTIFIER] NOT NULL,
    [ID] [INT] IDENTITY(1,1) NOT NULL,

    PRIMARY KEY CLUSTERED ([ID] ASC)
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
              IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
              ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

在这种情况下,我从列存储索引获得的性能提升可以忽略不计。使用列存储索引的查询几乎与没有索引的原始查询一样慢,在某些情况下甚至更慢,即使也使用了批处理模式。

令人惊讶的是,当我在现有表上创建一个不断增加的主键 ID 并重建列存储索引时,CPU 时间提高了 15 倍,运行时间提高了 3 倍。

我不明白添加主键如何影响列存储索引的查询性能,列存储索引无论如何都以压缩格式存储数据。此外,主键只会改变页面的顺序,在这种情况下,不会改变。

下面是执行计划执行计划

4

1 回答 1

4

aa 键的存在改变了列存储的构建方式。因为构建器按顺序获取输入,所以生成的段是段消除的更好候选者。阅读确保您的数据按日期排序或几乎排序以受益于日期范围消除的更多信息:

数据仓库查询中最常见的过滤器类型是按日期。如果系统可以确定没有行符合条件,则列存储段消除可帮助您跳过整个一百万行段,只需查看段中列的最小值和最大值。因此,您通常需要确保您的段按日期排序或接近排序,以便可以尽快执行日期过滤器。

您的订单已通过,ID但我很确定这会导致功能依赖的副作用。

于 2015-04-03T13:30:17.000 回答