【发布时间】: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