2013-03-14 4 views
-2

나는 아래의 질문을 가지고 그것을 조정할 더 좋은 방법이 있는지 알고 싶습니까?이 쿼리를 튜닝하는 더 좋은 방법이 있습니까?

MERGE INTO target_table TARGET USING 
(SELECT DISTINCT g1.column_name 
FROM test_gtt1 g1, 
test_gtt2 g2 
WHERE g1.column_name = g2.column_name 
AND g1.diff_id  IS NULL 
AND g2.diff_id  IS NULL 
UNION ALL 
SELECT DISTINCT g1.column_name 
FROM test_gtt1 g1, 
test_gtt2 g2 
WHERE 
g1.column_name = g2.column_name 
AND g1.diff_id = g2.diff_id 
AND g1.diff_id IS NOT NULL 
AND g2.diff_id IS NOT NULL 
) SOURCE ON (TARGET.column_name = SOURCE.column_name) 
WHEN MATCHED THEN 
UPDATE SET TARGET.column_name2 = 123; 
+0

당신의 논리와 같은 것은 매우 혼란이다. 예를 들어'select distinct ... union all ... ... select ... union ... select' 대신에 'distinct select'를 사용하는 이유는 무엇입니까? 간단히 말해, 문맥이없는 짧은 코드에서 우리를 추측하는 대신 비즈니스 규칙을 설명하십시오. – APC

+2

튜닝은 모두 세부 사항입니다. 어떤 오라클 버전입니까? 모든 teh 테이블에 몇 개의 행이 있습니까? USING 결과 집합에 몇 행이 있습니까? 얼마나 많은 행이 업데이트됩니까? 얼마나 시간이 걸려요? 얼마나 빨리 실행하고 싶습니까? 설명 계획은 뭐니? 색인이 생성되는 열은 무엇입니까? – APC

답변

1

데이터 유형, 색인 및 생성 된 계획이 무엇인지에 따라 다릅니다 (제공 한 경우 유용했을 것입니다).

는 그러나 노조는 분명히 중복 : 또한 사용하여 동일한 결과를 얻을 수있을 것이라고

SELECT DISTINCT g1.column_name 
FROM test_gtt1 g1, 
test_gtt2 g2 
WHERE g1.column_name = g2.column_name 
AND ((g1.diff_id IS NULL 
     AND g2.diff_id IS NULL) 
    OR (g1.diff_id IS NOT NULL 
     AND g2.diff_id IS NOT NULL)) 

갱신

(APC의 코멘트에 회신) 그것은 나에게 발생 .. ..

SELECT DISTINCT g1.column_name 
FROM test_gtt1 g1, 
test_gtt2 g2 
WHERE g1.column_name = g2.column_name 
AND DECODE(g1.diff_id, NULL, -1, 1)=DECODE(g2.diff_id, NULL, -1, 1); 
+0

엄밀히 말하자면 쿼리는 게시 된 UNION ALL UNION이 아닌 다른 결과 집합을 생성 할 수 있습니다. 그러나이 특정 경우에서 사용자 버전이 더 정확하다고 생각합니다. – APC

+0

아니요, 다른 결과 집합을 반환하지 않습니다. 원본 문에 2 개의 SELECT가 교차하지 않습니다. – symcbean

+2

'column_name'이 두 테이블 모두에서 유일한 경우에만, 우리는 알지 못합니다. 그렇지 않으면 쿼리의 양쪽에서 42라고 말할 수 있습니다. 따라서 원래 쿼리는 42 행에 2 행을 가지므로 원래 쿼리에는 1 행이 있습니다. 제가 말했듯이,이 경우에 한 행이 더 정확한 결과가 될 것입니다. – APC

-1

당신이 될 거라면 diff_id is nulldiff_id is not null을 테스트 할 필요가 없습니다 UNION으로 두 세트를 결합 :

 select * from foo where bar is null 
     union all 
     select * from foo where bar is not null 

 select * from foo 
+1

실제로 그는 테이블 중 하나에서 diff_id가 null 인 행을 제외하려고하지만 둘 다에서 제외하지 않으려합니다. –

+1

나는'g1.diff_id = g2.diff_id'를 간과했다. g1.diff_id가 null로, g2.diff_id가 null가 아닌 경우는 어떻게합니까? – Tim

관련 문제