【问题标题】:Update COLUMNSTORE index in DB transaction更新数据库事务中的 COLUMNSTORE 索引
【发布时间】:2021-05-14 15:49:07
【问题描述】:

是否可以在数据库事务中更新 COLUMNSTORE 索引?我想在事务中使用以下 SQL 命令:

ALTER INDEX [IX_Name] ON [dbo].[TableName] REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON)

交易可能需要很长时间。其他 SQL 客户端能否在事务期间使用该索引?

【问题讨论】:

  • 这在沙盒环境中进行测试非常简单,您这样做时发现了什么?
  • 出于好奇,您在事务中重组列存储的用例是什么?
  • @DanGuzman 用例是碎片整理,因为表中的数据变化很大,部分表数据被删除然后再次插入。
  • 我得到了碎片整理,但我想知道交易的原因。
  • @DanGuzman 事务的原因是,事务中的其他表还有其他操作需要从第一个表中读取。

标签: sql-server columnstore


【解决方案1】:

请注意,如果您不指定,SQL 中的所有内容都在其自己的隐式事务中运行,因此如果您只是运行 REORGANIZE,则运行它或将其包装在 BEGIN/COMMIT 中没有区别。

COMPRESSED 行组是不可变的,因此让我们为您的方案使用碎片整理而不是更新。在列存储世界中,更新转换为删除 + 插入,而删除是“延迟的”。更具体地说,删除反映在已删除的位图中,引擎将其与数据连接并返回对您的事务可见的行。删除位图的每行组状态可以在sys.dm_db_column_store_row_group_physical_stats DMV 中作为deleted_rows 列看到。另请注意,删除或更新 OPENCLOSED 行组发生在原地:对于删除,您将看到行数减少(更新不会更改行数),但是您永远不会看到任何 @987654329 @ 在这两种类型的行组中。

那么REORGANIZE 做了什么?它读取小的和/或零散的行组并将它们组合起来,但不是在适当的位置,而是将它们作为新行组写出,旧行组的状态将更改为TOMBSTONE。旧的行组将在它们有活跃的读者时存在,而在REORGANIZE 之后开始的事务将始终从新的行组中读取数据。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多