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 如何执行和操作。这不是生产级查询。
我在表上有一个列存储聚集索引,没有其他索引......查询计划显示扫描
嗯,这几乎是 CCI 唯一可用的选项。使用 CCI,性能增益来自列消除、压缩和段消除,所有这些都有助于减少 IO,从而允许快速执行扫描。对于你的情况,我会看两件事:
sys.column_store_row_groups
. 对于 1.1B 行,您应该有 ~1000 个行组,全部关闭并压缩。现在,您的查询:
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和大表是约。您正在选择满足日期范围和其他一些条件的所有列。什么了?分析数据是关于计算聚合和进行分析的。不要问*
。在服务器端计算相关分析。以不需要在原始数据页面上显示页面的方式重新设计您的应用程序。