列存储是否是带有 WHERE 子句的 UPDATES 的好选择?

Ale*_*dre 0 performance database-design sql-server columnstore table

我正在 SQL Server 上开发一个数据库项目,我在考虑使用列存储索引是否是一个好主意。

该项目由一个表 (A) 组成,该表将包含大量行,一列具有许多重复值。每天,一包新行将添加到表中,每个包都有一个“DateId”。

之后,我需要更新一个不同的表 (B) 加入 A 并过滤 A 以获取“DateId”和其他列。

SQL 中的示例:

CREATE TABLE A (
  [Id] [BIGINT] IDENTITY(1,1) NOT NULL,
  [DateId] [INT] NOT NULL,
  [B_Id] [BIGINT] NOT NULL,
  -- other columns...
  INDEX cci_A CLUSTERED COLUMNSTORE
)

CREATE TABLE B (
  [Id] [BIGINT] IDENTITY(1,1) NOT NULL,
  -- other columns...
  INDEX cci_B CLUSTERED COLUMNSTORE
)

UPDATE B
SET ...
FROM A
INNER JOIN B ON A.B_Id = B.Id
WHERE A.DateId = @myDateId
Run Code Online (Sandbox Code Playgroud)

在这种情况下,列存储是一个不错的选择吗?

Tib*_*szi 5

修改一行将导致旧行被标记为“已删除”(但它仍在列存储索引中)并将新行添加到增量存储(基于行的存储,当它达到约 100 万时将被压缩)行)。因此,您可以想象,随着时间的推移,许多更新会在某种程度上降低您的列存储索引。您当然可以进行索引维护,但是 B 上的列存储索引可能不是最佳选择...

  • 还取决于更新中实际更改的列,以及您从_不更改_的数据中获得多少压缩收益,将表分成两个 1:1 表可能是有意义的 - 一个表带有列存储,其中包含静态数据,一个不包含,包含确实更改的列。 (4认同)

归档时间:

查看次数:

47 次

最近记录:

5 年,4 月 前