내가 테이블 ACCPLAN이 조인 (PRIMARY KEY : ACCOUNT_ID)오라클 SQL : 연합과는
ACCOUNT_ID PLAN_TYPE OTHER_STUFF
ACC1 PLAN_TYPE_ONE ....
ACC2 PLAN_TYPE_TWO ....
ACC3 PLAN_TYPE_ONE ....
ACC4 PLAN_TYPE_TWO ...
I가 하나 이상의 테이블 ACCTRANSACTION (PRIMARY KEY -> (ACCOUNT_ID, TRANSACTION_ID)
ACCOUNT_ID TRANSACTION_ID TRANSACTION_AMOUNT TXN_TYPE
ACC1 1 100 TXN_TYPE_1
ACC1 2 300 TXN_TYPE_2
ACC2 1 400 TXN_TYPE_2
ACC3 1 400 TXN_TYPE_3
고정 plan_types 5 개와 고정 txn_types20 개가 있습니다. 각각의 plan_type에 대해 가능한 거래 유형 만 있습니다 (예 : 의 경우 TXN_TYPE_1 및 TXN_TYPE_2, PLAN_TYPE_TWO의 경우 TXT_TYPE_2 및 TXN_TYPE_2는 가능)
나는이 2 가지 방법
1
각 plan_type에 대한 검색 접근 방식으로 수행 할 수 있습니다
ACCPLAN
에서 거래 ACCTRANSACTION 정보 및 기타세부 정보를 검색하고, 노동 조합을하려고
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and ap.plan_type = PLAN_TYPE_ONE
and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2);
union
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and ap.plan_type = PLAN_TYPE_TWO
and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3);
union
...
접근법 2
,536,913 63,210더 나은 두 테이블이 큰 데이터를 고려하고 접근 모든 plan_types
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and
((ap.plan_type = PLAN_TYPE_ONE and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2))
or
(ap.plan_type = PLAN_TYPE_TWO and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3));
에 대해 하나의 쿼리를 사용하여 검색? 제발 제안 해주세요.
의견은 논점에 근거하고 있기 때문에 폐회 투표를하겠습니다. 여기에있는 이쪽은 오프 주제입니다. 두 쿼리 모두에서 Explain Plain을 실행하여 어느 것이 데이터베이스에 가장 적합한 지 확인해야합니다. –
본인은이 문맥에서 "최고"라는 말은 가장 빠른 것임을 이해합니다. 이것은 알고있는 데이터베이스 (오라클)에서 측정하고 재현 할 수 있습니다. 데이터베이스의 실행 계획을 이해하면 많은 결과 (색인, 통계, 버전, 구성 옵션, 하드웨어)에 영향을 미칠 수 있지만 무엇이 더 빠를 수 있는지에 대한 좋은 아이디어를 줄 수 있습니다. 어쨌든 일부 스택 교환 사이트로 리디렉션 될 수있는 많은 성능 관련 질문이 주기적으로 발생합니다. 이것에 대해 메타에서 어떤 것이 있습니까? – borjab
당신의 질문과는 무관합니다 : 당신은'where' 절에서 오래된 구식 암시 적 조인을 사용하지 말고'from' 절의 명시 적'JOIN' 연산자를 사용해야합니다. 나는 또한 두 번째 것이 아마도 더 효율적이라고 동의한다. 그럼에도 불구하고 첫 번째 것을 원한다면 중복을 제거하는 오버 헤드를 피하기 위해'UNION ALL'을 사용해야합니다. –