2015-11-05 73 views
0

考虑以下几点:指标的where子句和连接子句

  • 表1用下列:A,B,米
  • 表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' 

我必须优化此查询。

我有以下非群集索引:

  • 对表1的索引,其列a和b对表2的
  • 索引,其列于表2一 和b
  • 指数,用柱x和y

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

+0

我认为,你可以考虑到包括在'table1'索引中的列'M'(作为包含列) – Lamak

+0

@拉马克,是的,我明白了。我的实际查询比简单的例子更复杂。我对表2中的指数更感兴趣。这两个“现有”指数是否足够,还是应该创建一个全部4列的额外指标? –

+1

当提出查询计划时,优化器将只为每个表使用一个索引。你想确保这个索引是有用的。这可能取决于哪个表将被扫描,哪些将被索引键入,这可以取决于每个表的大小。您可能需要四处游览并查看正在使用哪个索引。如果不需要其他列(因此数据页不需要解除引用),可以将索引添加到索引中,这有助于使其成为“覆盖查询”,对IO有帮助。 –

回答

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)