【问题标题】:Indexes for where clause and join clausewhere 子句和 join 子句的索引
【发布时间】:2015-11-15 14:05:50
【问题描述】:

考虑以下几点:

  • 具有以下列的表 1:a、b、m
  • 具有以下列的表 2:a、b、x、y

这是我的查询:

select t2.a, t2.b, t1.m
from table2 t2
join table1 t1 on t1.a = t2.a 
              and t2.b = t2.b
where t2.x = 'some value'
  and t2.y = 'some other value'

我必须优化这个查询。

我有以下非聚集索引:

  • table1 上的索引,列 a 和 b
  • table2 上的索引,具有列 a 和 b
  • table2 上的索引,包含 x 和 y 列

我是否会受益于 table2 上的另一个索引,该索引将涵盖此查询中使用的所有列:a、b、x 和 y?

【问题讨论】:

  • 我认为您可以考虑将m 列包含在table1 的索引中(作为包含的列)
  • @Lamak,是的,我明白了。我的实际查询比简单示例更复杂。我对 Table2 上的索引更感兴趣。两个“现有”索引是否足够,或者我应该创建一个包含所有 4 列的额外索引?
  • 优化器在提出查询计划时将只对每个表使用一个索引。您要确保该索引是有用的。这可能取决于将扫描哪个表与将由索引键控的表,这可能取决于每个表的大小。您可能需要尝试一下,看看正在使用哪个索引。向索引添加额外的列有助于使其成为“覆盖查询”,如果不需要其他列(因此不需要取消引用数据页),这对 IO 会有所帮助。
  • 每张表大概有多少行?您期望结果大约有多少行?哪些是唯一键(已定义或可能)?
  • 可能有数百万行。我希望结果是一行。 x 和 y 组合将产生独特的结果。

标签: sql-server tsql


【解决方案1】:

考虑到 x 和 y 组合将提供单行,因此在 x 和 y 上的 table2 上具有索引以及在 a 和 b 上的 table1 上具有索引非常重要。或者,您可以使第一个索引唯一并添加包含的列,如下所示:

CREATE UNIQUE INDEX IX_table2_x_y ON table2 (x,y) INCLUDE (a,b)
CREATE INDEX IX_table1_a_b ON table1 (a,b) INCLUDE (m)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多