【问题标题】:Index on join and where加入索引和位置
【发布时间】:2016-12-21 12:56:29
【问题描述】:

给定下一条 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))以提高性能是否有意义?

非常感谢!

【问题讨论】:

  • 这没有意义。优化器会将 WHERE 条件推送到基表,并且只会在执行任何联接之前读取具有“正确”年份的行。您在两个表中都有关于“年份”的索引吗?这会有所帮助。

标签: sql oracle11g sqlperformance


【解决方案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 上的索引是正确的做法。在这个版本中,索引中列的顺序并不重要。

【讨论】:

  • 但是B表的索引还不够吗? A表索引有必要吗?
  • @Alex 。 . .如果按年份过滤有用,则 A 上的索引很有用。
  • 对不起,我想说的是:表 A 上的年索引还不够吗?有必要在A上复合吗?
  • @Alex 。 . .好吧,这就足够了。通过在索引中包含连接列,查看数据页面只需要发生在连接之后而不是之前。不过我承认,我不知道 Oracle 是否实现了这种优化。
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 2017-10-31
  • 1970-01-01
  • 2018-03-11
  • 2014-07-26
  • 2011-11-13
  • 1970-01-01
  • 2021-05-23
相关资源
最近更新 更多