2014-09-18 2 views
2

이것은 Oracle 11g입니다.대부분 "퇴화 된"내부 조인을 개선하려면 어떻게해야합니까?

나는 (테이블을 위해 내가 가진 주어진 - 나는 열 데이터 유형을 변경할 수 없습니다) 그 관련 열 아래 두 개의 테이블이 :

CREATE TABLE USERS 
(
    UUID VARCHAR2(36), 
    DATA VARCHAR2(128), 
    ENABLED NUMBER(1) 
); 

CREATE TABLE FEATURES 
(
    USER_UUID VARCHAR2(36), 
    FEATURE_TYPE NUMBER(4) 
); 

표는 사용자가 될 수있는 개념을 표현 여러 기능이 지정되었습니다. (USER_UUID, FEATURE_TYPE) 조합은 고유합니다.

필자는 두 가지 매우 비슷한 쿼리를 사용하고 있는데, 영어로 표시되는 첫 번째 기능은 "기능 X가 할당 된 활성화 된 사용자의 UUID를 반환합니다"입니다. 두 번째는 "기능 X가 할당 된 활성화 된 사용자의 UUID 및 DATA를 반환합니다"입니다. USERS 테이블에는 약 5,000 개의 레코드가 있고 FEATURES 테이블에는 약 40,000 개의 레코드가 있습니다.

나는 처음으로 순진 첫 번째 쿼리를 작성 :

SELECT u.UUID FROM USERS u 
JOIN FEATURES f ON f.USER_UUID=u.UUID 
WHERE f.FEATURE_TYPE=X and u.ENABLED=1 

및 그 형편없는 성능을 가지고 있었다.

SELECT USER_UUID FROM FEATURES WHERE TYPE=X 

을하고 매우 빠르게 실행 : 실험으로 나는 사용자가 사용되었고, 그 시도 나에게 영감을할지 여부에 대해 걱정하지 않은 경우 무슨 일이 일어날 지보고했습니다. 그다음 내게 영감을 주었다.

두 번째 쿼리만큼 빠르게 실행되지는 않았지만 첫 번째 쿼리보다 훨씬 빠르게 실행되었습니다.

더 많은 생각을 한 후에 나는 모든 사용자 또는 거의 모든 사용자에게 적어도 하나의 기능이 할당되었다는 것을 알았습니다. 이는 조인 조건이 항상 또는 거의 항상 참이라는 것을 의미합니다. 이는 내부 조인이 완전히 또는 대부분 조인되었음을 의미합니다 타락하여 십자가에 합류했다. 그리고 5,000 x 40,000 = 200,000,000 이래로 좋은 것은 아닙니다. 분명히 INTERSECT 버전은 훨씬 적은 수의 행을 처리 할 것이기 때문에 아마도 상당히 빨라졌습니다.

질문 :INTERSECT이 경우에 실제로가는 방법입니까, 아니면 다른 유형의 참여를해야합니까?

은 또한 유사 DATA을 반환하는 데 필요한 하나에 대한 쿼리를 쓴 최초의 하나

SELECT u.UUID, u.DATA FROM USERS u 
JOIN FEATURES f ON f.USER_UUID=u.UUID 
WHERE f.FEATURE_TYPE=X and u.ENABLED=1 

그러나 더 열이 FEATURES에 없기 때문에 내가 여기 INTERSECT 트릭을 할 수없는 것 같다 DATA 열과 일치합니다.

질문 : 퇴화 된 조인 문제를 피하고 DATA을 반환하지 않는 쿼리를 수행하려면 어떻게 다시 작성해야합니까?INTERSECT 필요의 (a를이었다 더 이상 존재하지 않기 때문에

SELECT u.UUID, u.DATA 
FROM USERS u 
WHERE u.ENABLED=1 
    AND EXISTS (SELECT 1 FROM FEATURES f where f.FEATURE_TYPE=X and f.USER_UUID=u.UUID) 

당신이 USERS에서 모든 필드를 선택할 수있는이 방법 :

SELECT u.UUID 
FROM USERS u 
WHERE u.ENABLED=1 
    AND EXISTS (SELECT 1 FROM FEATURES f where f.FEATURE_TYPE=X and f.USER_UUID=u.UUID) 

또는 유사 :

+0

각 테이블의 인덱싱 및/또는 분할 방법은 무엇입니까? –

+0

"SELECT USER_UUID FEATURES FROM TYPE = X"쿼리에서 반환 한 레코드 수 –

답변

2

나는 직관적으로 EXISTS 절을 사용합니다 제 1의 경우를 위해 오히려 좋은 선택, IMHO).

관련 문제