SQL Server 2016 ColumnStore Clustered Index - 显示扫描的查询计划,性能不是很好

Ran*_*der 2 sql-server columnstore

我有一个 SQL 2016 表,如下所示:

在此处输入图片说明

我在表上有一个列存储聚集索引,没有其他索引。我正在执行以下查询:

Select *
From dbo.PanelWorkflow
Where ReadTime Between '4/1/2016' And '4/5/2016' And Lineage = 'PBG11A' And ProcessNumber = 5400
Run Code Online (Sandbox Code Playgroud)

查询计划如下所示:

在此处输入图片说明

该表有 1.1B 行。查询计划显示了一次扫描,执行查询大约需要 1 分钟。返回约 21K 行。这是我对列存储聚集索引的期望吗?是否总是进行扫描(假设表上没有其他索引)?这是我可以期待的表现吗(可以接受但不是很好)?

我设置了统计 IO 并得到以下输出:

Table 'PanelWorkflow'. Scan count 2, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 9733431, lob physical reads 195, lob read-ahead reads 13045645.
Table 'PanelWorkflow'. Segment reads 955, segment skipped 336.
Run Code Online (Sandbox Code Playgroud)

最后,上面的查询严格来说是一个测试查询,用于了解 CSI 如何执行和操作。这不是生产级查询。

Rem*_*anu 6

我在表上有一个列存储聚集索引,没有其他索引......查询计划显示扫描

嗯,这几乎是 CCI 唯一可用的选项。使用 CCI,性能增益来自列消除、压缩和段消除,所有这些都有助于减少 IO,从而允许快速执行扫描。对于你的情况,我会看两件事:

  • 检查段健康:sys.column_store_row_groups. 对于 1.1B 行,您应该有 ~1000 个行组,全部关闭并压缩。
  • 检查您是否以允许段消除的方式加载数据。阅读了解段消除。鉴于您的日期范围过滤器,您的查询应该只扫描这 1000 个细分中的 1(一个),并跳过其他 999 个。如果这没有发生,则意味着您以防止细分消除的方式加载数据。阅读列存储索引 - 数据加载指南

现在,您的查询:

Select *
From dbo.PanelWorkflow
Where ReadTime Between '4/1/2016' And '4/5/2016' And Lineage = 'PBG11A' And ProcessNumber = 5400
Run Code Online (Sandbox Code Playgroud)

这不是columnstores和大表是。您正在选择满足日期范围和其他一些条件的所有列。什么?分析数据是关于计算聚合和进行分析的。不要问*。在服务器端计算相关分析。以不需要在原始数据页面上显示页面的方式重新设计您的应用程序。