【发布时间】:2020-05-22 17:34:03
【问题描述】:
我正在从具有以下结构和索引的表中读取数据
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Bets](
[bwd_BetTicketNr] [bigint] NOT NULL,
[bwd_LineID] [int] NOT NULL,
[bwd_ResultID] [bigint] NOT NULL,
[bwd_LineStake] [bigint] NULL,
[bwd_CreatedAt] [datetime] NULL,
[bwd_DateModified] [datetime] NULL,
CONSTRAINT [PK_BetwayDetails] PRIMARY KEY CLUSTERED
(
[bwd_BetTicketNr] ASC,
[bwd_LineID] ASC,
[bwd_ResultID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [idx___Bets__bwd_CreatedAt] ON [dbo].[Bets]
(
[bwd_CreatedAt] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [idx___Bets__bwd_DateModified] ON [dbo].[Bets]
(
[bwd_DateModified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX [nccs___Bets] ON [dbo].[Bets]
(
[bwd_BetTicketNr]
)WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
GO
我想了解表开发人员决定在 bwd_BetticketNr 列上使用非聚集列存储索引,而不是像在日期列中那样使用经典行存储。
生产表约 60 亿行,唯一 bwd_Betticketnr 值约 5000 万
使用行存储和列存储对多达 5000 万行的测试表运行查询具有相似的性能,因此我无法模拟缩放。由于数据类型和基数,列存储是否更合适?
我试图找到类似的问题/帖子/博客进行此类比较,但我还没有找到任何东西。
我使用的是 SQL Server 2017。
【问题讨论】:
-
这样做的一个很好的副作用是,即使在不使用列存储索引的查询上也可以获得批处理模式(rowstore 上的批处理模式在 2019 年不可用)。但是为此添加的索引通常会被过滤