连接和位置索引

Ale*_*lex 9 sql sqlperformance oracle11g

给出下一个 SQL 语句:

Select * 
  from A join B
           on A.id1=B.id1 and 
              A.id2=B.id2
 where A.year=2016
   and B.year=2016
Run Code Online (Sandbox Code Playgroud)

并且知道 tableA比 table 小得多B,所以我需要数据库首先按A年份访问表,然后加入,然后按B年份过滤表,我的问题是:

为提高性能而创建索引是否有意义B(id1,id2,year)

非常感谢!

Gor*_*off 7

对于此查询:

Select *
from A join
     B
     on A.id1 = B.id1 and A.id2 = B.id2
where A.year = 2016 and B.year = 2016;
Run Code Online (Sandbox Code Playgroud)

我建议在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;
Run Code Online (Sandbox Code Playgroud)

您的问题的答案是“是”,索引B是正确的做法。在此版本中,索引中列的顺序并不重要。