2016-12-21 29 views
0

考慮下一個SQL語句:指數的加盟,其中

Select * 
    from A join B 
      on A.id1=B.id1 and 
       A.id2=B.id2 
where A.year=2016 
    and B.year=2016 

,知道表A比表B小很多,所以我需要數據庫首先在今年訪問A表,然後再加入,然後過濾B按年表,我的問題是:

是否有意義創建一個索引B(id1,id2,year)爲提高性能?

非常感謝!

+0

這沒有意義。優化器會將WHERE條件推送到基表,並且只會在它進行任何加入之前讀取具有「適當」年份的行。你有兩個表中的「年份」索引嗎?這將有所幫助。 – mathguy

回答

1

對於此查詢:

Select * 
from A join 
    B 
    on A.id1 = B.id1 and A.id2 = B.id2 
where A.year = 2016 and B.year = 2016; 

我建議在A(year, id1, id2)B(id1, id2, year)指標。

你也可以編寫查詢爲:

Select * 
from A join 
    B 
    on A.id1 = B.id1 and A.id2 = B.id2 and A.year = B.year 
where A.year = 2016; 

的回答你的問題是「是」,並在B指數是做正確的事。在這個版本中,索引中列的順序並不重要。

+0

但是B表的索引不夠? A表索引是否必要? – Alex

+0

@Alex。 。 。如果按年篩選有用,則A上的索引很有用。 –

+0

對不起,我想說的是:在表A上的年份不是索引嗎? A上的組合是否有必要? – Alex