2012-11-26 2 views
3

DB2로 처음으로 작업합니다. 나는 조합을 수행하는 저장된 proc를 가지고있다. 프로 시저가 시간 종료됩니다. union의 양쪽에있는 select 문은 개별적으로 수행 할 때 아무런 문제없이 신속하게 실행됩니다. 왜 조합이 이것을할까요?DB2 연합이 시간 초과를 유발합니까?

DECLARE Foo CURSOR WITH RETURN FOR 
    Select STRIP(A.Name) as my_Name, 
    Case A.Number 
     when 2 then '(' || strip(char(A.Number)) || ')' strip(B.num) 
     when 3 then '(' || strip(char(A.Number)) || ')' strip(C.num) 
     when 4 then '(' || strip(char(A.Number)) || ')' strip(D.num) 
     when 5 then '(' || strip(char(A.Number)) || ')' strip(E.num) 
     when 6 then '(' || strip(char(A.Number)) || ')' strip(F.num) 
     end as my_number 
    FROM A 
     left outer join B on A.Number= 2 and A.Name = B.Name 
     left outer join C on A.Number= 3 and C.Name = B.Name 
     left outer join D on A.Number= 4 and D.Name = B.Name 
     left outer join E on A.Number= 5 and E.Name = B.Name 
     left outer join F on A.Number= 6 and F.Name = B.Name 
     ,session.Temp_Result X 
    WHERE X.ID = A.ID 
    GROUP BY A.Number, A.Name, B.Name, C.Name, D.Name, E.Name, F.Name 
for fetch only ur; 

DROP TABLE Session.Temp_Result; 

DECLARE GLOBAL TEMPORARY TABLE session.Temp_Result 
( ID DECIMAL(18,0) 
); 

INSERT INTO session.Temp_Result 
     select X.ID 
     from Z, Y, X, Q 
     where Z.num = 6 
      and Z.ID = Y.ID2 
      and Y.GROUPA = 'ABC' 
      and Y.GROUPB = 'DEF' 
      and Y.ID = X.ID2 
      and X.ID = Q.ID    
     union 
     select W.ID 
     from Z, Y, W 
     where Z.num = 6 
      and Z.ID = Y.ID2 
      and Y.GROUPA = 'ABC' 
      and Y.GROUPB = 'DEF' 
      and Y.ID = W.ID2 
     group by ID; 


    OPEN C_HIERARCHIES; 
+2

SELECT 문뿐만 아니라 관련된 각 열의 유형을 게시하십시오. – uselpa

+0

'UNION'이 중복을 제거했다는 것을 감안할 때, 나는 그 문제의 일부라고 느낀다. 리턴되는 행 수 (각 명령문 별), 인덱스 등은 유용한 정보 일 수 있습니다. –

+0

현재 약 5 개의 ID를 리턴하는 각 명령문. 나는 내일까지 어떤 색인 정보도 얻을 수 없다. – Loscas

답변

2

시도가 "로"를 사용하여 쿼리 : 여기

데이터 유형 INT 또는 문자열 중 하나입니다 가정, proc 디렉토리에 대한 몇 가지 sudo는 코드, 비교 또는 UNION을 때 그렇지 않으면 SQL에서 언급하지 않는 한 그들은 일치 성명서.

DECLARE GLOBAL TEMPORARY TABLE session.Temp_Result (
ID DECIMAL(18,0)) 
WITH REPLACE; 

INSERT INTO session.Temp_Result 
(ID) 
WITH Q1(Y_ID) 
AS (
SELECT Y.ID 
FROM Z 
    INNER JOIN Y ON Z.ID = Y.ID2 
WHERE Z.NUM = 6 AND Y.GROUPA = 'ABC' AND Y.GROUPB = 'DEF') 

SELECT X.ID 
FROM X 
    INNER JOIN Q1 ON X.ID2 = Q1.Y_ID 
WHERE EXISTS(SELECT 1 FROM Q WHERE Q.ID = X.ID) 
UNION 
SELECT DISTINCT W.ID 
FROM W 
    INNER JOIN Q1 ON W.ID2 = Q1.Y_ID 

도움이되지 않으면 select 문에 "Explain SQL"을 사용해보십시오. 어쩌면 당신은 몇 가지 인덱스를 생성해야합니다 ...

+0

만일 테이블이 어떻게 색인화되었는지를 볼 수 있다면 필요합니다. 그러나 현재 환경에서는 가능하지 않습니다. – Loscas

+0

세 번째 줄의 WITH REPLACE 문은 저장 프로 시저에서 오류를 발생 시키지만, 제거하면 프로 시저 실행이 향상되고 더 이상 시간이 초과되지 않습니다. – Loscas

+0

두 개의 select 문의 중복 된 부분을 결합하여 한 번만 수행하면 효율성이 높아집니다. 나는 이것이 그 시간을 고치는 것에 조금 놀랐다. 두 select 문은 각각 1 초 이내에 실행됩니다. 나는 이것이 조합의 이유라고 가정한다. DB2는 하나의 select 문을 사용하여 select를 실행하면서 다른 select 문에서 결과를 필터링한다. – Loscas

1

제 생각 엔 원래 코드에 의사 코드에있는 조인 조건이 없습니다. 쿼리를 확인하려면 적절한 조인 구문을 사용하여 쿼리를 다시 작성해야합니다.

select distinct id from TempResult 
:

INSERT INTO session.Temp_Result 
    select X.ID 
    from Z, Y, X, Q 
    where Z.num = 6 
     and Z.ID = Y.ID2 
     and Y.GROUPA = 'ABC' 
     and Y.GROUPB = 'DEF' 
     and Y.ID = X.ID2 
     and X.ID = Q.ID; 

INSERT INTO session.Temp_Result 
    select W.ID 
    from Z, Y, W 
    where Z.num = 6 
     and Z.ID = Y.ID2 
     and Y.GROUPA = 'ABC' 
     and Y.GROUPB = 'DEF' 
     and Y.ID = W.ID2 
    group by ID; 

는 그런 다음으로 Temp_Result를 조회 할 수 있습니다 : 각 하위 쿼리가 빠르게 실행하고 노동 조합의 일부 왜곡 된 결과가있는 경우 어떤 경우

는 두 개의 삽입으로 분할 시도 할 수 있습니다

데이터가 너무 작기 때문에 중복 제거는 필요하지 않지만 직접 수행 할 수도 있습니다.

관련 문제