3

初めて DB2 を使用します。ユニオンを実行するストアド プロシージャがあります。手順がタイムアウトします。ユニオンの両側の選択ステートメントは、個別に実行しても問題なく迅速に実行されます。なぜ労働組合はこれを行うのでしょうか?

proc の sudo コードを次に示します。データ型は int または string のいずれかであり、SQL で特に明記されていない限り、比較または共用すると一致すると仮定します。

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;
4

2 に答える 2

2

「with」ステートメントを使用してクエリを実行してみてください。

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ステートメントに「ExplainSQL」を使用してみてください。多分あなたはいくつかのインデックスを作成する必要があります...

于 2012-12-02T08:45:17.583 に答える
1

私の推測では、元のコードには疑似コードに存在する結合条件がありません。クエリを検証するには、適切な結合構文を使用してクエリを書き直す必要があります。

いずれにせよ、各サブクエリがすばやく実行され、ユニオンの悪い結果がある場合は、それを 2 つの挿入に分割してみてください。

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 を次のようにクエリできます。

select distinct id from TempResult

データが非常に小さいため、重複を削除する必要はないように思われますが、直接行うこともできます。

于 2012-12-06T22:39:37.583 に答える