2016-12-21 7 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 테이블, 내 질문은 :

는 성능을 (id1,id2,year) 같은 B 이상의 인덱스를 생성하기위한 개선하기 위해 의미가 무엇입니까?

감사합니다. 이 쿼리

+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에서 1 년이 넘는 색인이 아닙니까? A에 합성물이 필요한가? – Alex