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