Sql DB2联合导致超时?
第一次使用DB2。我有一个执行联合的存储进程,它无论如何都会尝试。程序超时。当单独执行时,union两侧的select语句执行得很快,没有问题。为什么工会会这样做 以下是程序的一些sudo代码,假设数据类型为int或string,并且它们在比较或联合时匹配,除非SQL中另有说明:Sql DB2联合导致超时?,sql,performance,timeout,db2,Sql,Performance,Timeout,Db2,第一次使用DB2。我有一个执行联合的存储进程,它无论如何都会尝试。程序超时。当单独执行时,union两侧的select语句执行得很快,没有问题。为什么工会会这样做 以下是程序的一些sudo代码,假设数据类型为int或string,并且它们在比较或联合时匹配,除非SQL中另有说明: DECLARE Foo CURSOR WITH RETURN FOR Select STRIP(A.Name) as my_Name, Case A.Number when 2 then
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;
尝试使用“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语句使用“解释SQL”。也许您应该创建一些索引…我的猜测是原始代码缺少伪代码中存在的连接条件。您应该使用正确的联接语法重写查询以验证查询 在任何情况下,如果每个子查询都运行得很快,并且联合会产生一些不正常的结果,您是否可以尝试将其拆分为两个插入:
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;
然后您可以查询临时结果,如下所示:
select distinct id from TempResult
删除重复项似乎没有必要,因为数据太小,但您也可以直接这样做。请发布SELECT语句,以及所涉及的每个列的类型。鉴于
联合删除重复项,我觉得这是问题的一部分。(每个语句)返回多少行,索引是什么样的,等等,可能是有用的信息。每个语句此时大约返回5个ID。我要到明天才能得到任何索引信息。如果我能看到这些表是如何被索引的,并在nessecary的情况下对它们进行修改,那将是非常理想的,但是在当前环境中这是不可能的。下面第三行的WITH REPLACE语句会导致存储过程出错,删除该语句后,程序的执行得到了改善,不再超时。将两个select语句的重复部分合并起来,只执行一次,这样会更有效。不过,我有点惊讶,这会解决这个问题。这两个select语句在不到一秒钟的时间内分别执行。我假设这意味着由于union,DB2在执行select语句时使用一个select语句过滤另一个select语句的结果