【问题标题】:Clustered Index Vs Non-Clustered Index Usage聚集索引与非聚集索引的使用
【发布时间】:2020-08-04 09:41:53
【问题描述】:

我是 T-SQL 中查询优化的新手,我对其中一种实现有点困惑。

这里已经解释了这个场景:我有这个表(表 A),在这个表上发生了常规插入,没有更新 - 仅在数据被移动到另一个表(表 B)时插入,基于特定列上的过滤器在表 A (Col-1) 中。

我关注的表 A 中的两列是 Col-1(身份列)和 Col-2(nvarchar(20) -- 并且有重复项)。

当我将数据从表 A 移动到表 B 时,我在 Col-2 上过滤记录。

我是否应该在 Col-1 上定义聚集索引,在 Col-2 上定义非聚集索引,因为我在 Col-2 上进行过滤;还是应该只在 Col-2 上定义一个非聚集索引来提高查询性能?

或者我应该将表保留为堆,并且只在 Col-2 上定义非聚集索引。

此外,定义聚集索引并将表存储为 B 树会降低性能,因为我们每周通过插入将数据附加到表 -A 中。

感谢您的帮助。

【问题讨论】:

  • 这取决于体积和 col2 中不同值的数量。请提供更多信息。
  • 这类问题没有通用答案。不同的索引设计会有不同的权衡。您必须尝试不同的设计,才能找到最适合您工作负载的设计。而且您通常不会提前做出这些决定。
  • @GordonLinoff : 数据量每周都在增加,截至目前有 50k 条记录,col2 值中的值对行组进行分类。例如,前 200 行的值为 'Row Group 1' 和 next 200 可能有 'Row Group 2' 等等,col-2 只是用于对行进行分类的指标。
  • 只要你没有聚集索引——那么你的表就是一个——相当于一堆数据流......堆是出了名的缓慢和“笨拙” - 所以拥有一个、精心挑选的聚集索引很有意义。 As Kimberly Tripp - the Queen of Indexing 显示 - 精心挑选的聚集索引实际上甚至可以加速插入和更新(一直 - 或至少大部分时间) - 所以拥有它总是一个好主意!
  • 如果您无法在生产之外创建真实的测试场景,这是您需要解决的第一件事。

标签: sql sql-server tsql query-optimization database-indexes


【解决方案1】:

正如这里的许多人所说,如果不进行测试,很难明确地说出最佳解决方案是什么。但是,您说您在选择移动数据之前通过 col2 进行过滤。根据移动这些记录的百分比,我建议从对唯一 col1 进行聚类开始。然后在 col2 上创建一个非聚集索引。非聚集索引的一个优点是您可以使用 WHERE 子句使其成为过滤索引。因此,例如,如果只有 10% 的记录具有您关心的几个选项中的 col2 值,则索引 'WHERE col2 IN (val, val2, val3) 将小 10 倍,因此访问速度更快。

如果您走这条路,请确保您的 SELECT 中的 WHERE 子句与您在索引上指定的 WHERE 子句匹配。

【讨论】:

  • 那是我已经实施的索引策略,我唯一没有根据你的建议实施的是过滤索引,因为传递给 where 子句的值是一个变量,我不认为它可以添加到过滤索引中,但仍会检查过滤索引,如果它们可以在这种情况下使用
猜你喜欢
  • 2013-08-07
  • 2013-08-20
  • 2021-09-07
  • 2018-05-08
  • 2021-01-14
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多