【问题标题】:clustered columnstore index is slow聚集列存储索引很慢
【发布时间】:2016-01-12 17:08:36
【问题描述】:

我有一个很大的表,有 400 列和 100,000 行。 当我选择所有列时,查询非常慢(~7500ms)。 3 列上只有一个主键集。 我不在乎插入/更新的速度,这个表主要用于读取。 我正在阅读关于 Clustered Columnstore Index 如何非常符合我的要求以提高读取性能的信息。

所以我尝试使用聚集列存储索引,速度几乎相同(约 7000 毫秒)。我真的期待一个更高的改进。我错过了什么吗?

【问题讨论】:

  • 7.5 秒选择 40,000,000 条数据实际上并没有那么慢。大部分时间可能都花在处理大型数据集上。

标签: sql indexing sql-server-2012


【解决方案1】:

仅选择 400 列中的一部分时,您将看到真正的性能提升。在传统的行存储中,当您选择该行时,始终必须访问所有列,即使您只选择了几列。对于列存储,如果您只选择了 400 列中的 100 列,则查询速度应该大约快四倍,其中 25% 的逻辑读取。使用 select * 您不会看到太大的改进。

【讨论】:

    【解决方案2】:

    我刚刚遇到了类似的问题,我们目前有一个包含 1.76 亿行的表。我根本不是数据库管理员,我发现列存储索引不是灵丹妙药。正如您所观察到的,您选择的列越多,速度就越慢。

    我解决这个问题的一种方法是在我的 WHERE 子句中使用列存储索引并检索我需要的行的 PK。然后是使用 PK 运行 SELECT * 的问题,这会导致在 PK 上进行简单的聚集索引查找。

    这可能是要尝试的东西。

    【讨论】:

      【解决方案3】:

      要回答这个问题,我需要知道您的查询以及 where 子句中字段的列定义。

      这些是相同的数据类型以确保使用索引是非常重要的。有时必须进行转换(时间戳到日期或字符到日期等),这使得无法使用索引。

      【讨论】:

      • 与没有WHERE 子句的SELECT * FROM TableName 查询无关。
      • 提问者并没有说明他/她没有where子句。他只说他正在选择所有列。并不是说他选择了所有行。
      • 这在屏幕截图中可见。
      • 对不起,你是对的。但是,为什么提出问题的人根本使用索引。我想他最后不想选择所有行,这就是他看不到性能结果的原因。一旦选择了所有行,就不需要使用索引了。
      • 聚集列存储索引的优点是高水平的压缩和批处理模式操作,它们不是 B 树索引/
      猜你喜欢
      • 2020-09-15
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多