2014-07-23 2 views
0

우리 시스템에는 db2 database에 대한 몇 가지 성능상의 문제점이 있습니다. 최근 SQL을 실행하는 데 너무 많은 시간이 걸릴 수 있습니다. 다음 하나가 I하면 교체하면서 그 10 배가된다 "b.code1" 와 "병합 (b.code2, b.code1)"는 약 1 초 비용db2는 병합 함수의 성능을 향상

select * from table1 a 
inner join table2 b on a.code = coalesce(b.code2,b.code1); 

단순한 경우이다 (추가 : table2.code2에는 null 값만 있습니다.)

일부 복잡한 명령문에서는 1 초와 비교하여 40 초가됩니다.

미래에 null이 아닌 경우에 대비하여 code2를 유지하면서 성능을 향상시킬 수있는 방법이 있다면 더 좋을 것입니다. 각 열에 인덱스를 만들려고했지만 전혀 개선되지 않는 것 같습니다. 또한 병합 함수를 대체하는 일부 조건식을 시도했지만 비용이 동일했습니다.

+0

'COALESCE (...)'의 성능을 향상시킬 수는 없습니다. 기본적으로 널이 아닌 첫 번째 값을 확인하는 'CASE' 문입니다 e (알았어, 어떤 db는'IFNULL (...) '을 제공하는데, 열이 함수 나 계산을 포함하고 있다면 약간 더 빠를 수 있지만 여기서는 관련이 없다). 이 경우 문제는 옵티마이 저가 주어진 열에 인덱스를 사용할 수 없게하는 것이므로 최선의 방법은 이것을 다른 방법으로하는 것입니다. –

답변

2

Equi-join 이외의 항목은 Equi-join보다 성능이 떨어집니다. 평등 연산자를 사용하더라도 결합을 사용하면 Equi-join으로 간주되지 않습니다.

table2 (code2, code1)에 대한 색인이 있습니까? 그렇지 않으면 아마도 도움이 될 것입니다.

당신은 먼저 중복 행을 제거하기 위해 DB를 UNION 대신 UNION ALL을 강제로 사용 대안

select * from table1 a 
inner join table2 b on a.code = b.code2 
UNION ALL 
select * from table1 a 
inner join table2 b on a.code = b.code1 
where b.code2 is NULL; 

select * from table1 a 
inner join table2 b on a.code = b.code2 
UNION ALL 
select * from table1 a 
inner join table2 b on a.code = b.code1 and b.code2 is NULL; 

생각

동등가 조인 두 가지의 조합을 시도 할 수 있습니다.

select * from table1 a 
inner join table2 b on a.code = b.code2 
UNION 
select * from table1 a 
inner join table2 b on a.code = b.code1; 

다음 인덱스 또는 (사용 명령문 및 데이터에 따라) 임의의 용도로하지 않을 수

  • 표 2 (CODE2)
  • 표 2 (코드 1)
  • 표 2 (code1, code2)
+0

인덱스가있는 여러 개의 'JOIN'이 내가 사용한 첫 번째 항목이었을 것입니다. (문제 테이블 정의의 논리는 이해가 안되는 것 같습니다.) – user2338816

+0

감사합니다. 노동 조합의 모든 문장이 훨씬 빠르게 실행됩니다. – user1902861

+0

@ user1902861 여러분을 환영합니다. 답변을 수락 된 것으로 표시하십시오. – Charles

관련 문제