2015-11-05 71 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)