繁体   English   中英

DB2 查询性能

[英]DB2 query performance

以下查询的目的是连接具有两种不同来源的同一个表,并找出 N_ID 匹配或 L_ID 匹配的位置。 下面的查询在 2 分钟内在 SQL 服务器中执行,而当我在 DB2 中执行相同的查询时,它需要 1 小时。 如果有人可以帮助提高性能,那就太好了。 索引列是否会解决问题,或者是否有任何其他方式我需要重写查询。 我们有大约 1700 万条源为 E 的记录和大约 200 万条源为 <>'E' 的记录。 我正在使用 DB2 10.5。 目前此表没有索引

    select ID from TABLE where N_ID  in(select N_ID from TABLE where N_ID in(
select aa.N_ID from
(select N_ID from TABLE where SOURCE<>'E')aa
INNER JOIN
(select N_ID from TABLE where SOURCE='E' )bb
on aa.N_ID=bb.N_ID))
 UNION 
 select ID from TABLE where L_ID in(
(select aa.L_ID from
(select L_ID from TABLE where SOURCE<>'E')aa
INNER JOIN
(select L_ID from TABLE where SOURCE='E' )bb
on aa.L_ID=bb.L_ID ))

现在我重写上面的查询,使其在 7 分钟内完成

select ID from TABLE where N_ID in(
select aa.N_ID from
(select SRC.N_ID from TABLE SRC,TABLE REF 
where SRC.SOURCE<>'E' and REF.SOURCE='E' and
SRC.N_ID=REF.N_ID)aa)

 UNION ALL

select INT_CIL_ID from TABLE where LEI_CODE in(
select aa.LEI_CODE from
(select SRC.LEI_CODE from TABLE SRC,TABLE REF 
where SRC.SOURCE<>'E' and REF.SOURCE='E' and
SRC.LEI_CODE=REF.LEI_CODE)aa)

在类似的注释中,我对下面的查询也有同样的问题,在 sql server 中它在 3 分钟内工作并且 DB2 永远运行。

select aa.ID from 
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from TABLE where SOURCE<>'EXTERNAL')aa
INNER JOIN
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from TABLE where SOURCE='EXTERNAL' )bb
on  
aa.O_NAME=bb.O_NAME
UNION
select bb.ID from 
(select  case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from .TABLE where SOURCE<>'EXTERNAL')aa
INNER JOIN
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from .TABLE where SOURCE='EXTERNAL' )bb
on  
aa.O_NAME=bb.O_NAME
UNION
select ID from TABLE where replace(FIRSTNAME,' ','') in(
select distinct aa.FIRSTNAME from
(select distinct replace(FIRSTNAME,' ','')FIRSTNAME from TABLE where SOURCE<>'EXTERNAL' and FIRSTNAME is not null)aa
INNER JOIN
(select distinct replace(FIRSTNAME,' ','')FIRSTNAME from TABLE where SOURCE='EXTERNAL' and FIRSTNAME is not null)bb
on aa.FIRSTNAME=bb.FIRSTNAME)

如果不查看表的物理特征,并且如果您正在将比较与 SQL Server 进行比较,则很难真正提供帮助。 例如,表在两个系统上是否具有相同的索引等。 SQL 的解释计划也会有所帮助

事实上,您的 SQL 看起来并不太低效,但是您可以尝试这样的操作来代替上次查询的第一部分。 它明确加入了 4 种可能的情况

WITH
    T1 AS (SELECT * FROM TABLE WHERE where SOURCE = 'EXTERNAL')
,   T2 AS (SELECT * FROM TABLE WHERE where SOURCE <> 'EXTERNAL')
select T1.ID FROM T1 JOIN T2 USING ( L_NAME )
UNION
select T1.ID FROM T1 JOIN T2 ON T1.L_NAME = T2.O_NAME WHERE T2.L_NAME IS NULL
UNION
select T1.ID FROM T1 JOIN T2 ON T1.O_NAME = T2.T_NAME WHERE T1.L_NAME IS NULL
UNION
select T1.ID FROM T1 JOIN T2 USING ( O_NMAE )WHERE T1.L_NAME IS NULL AND T2.L_NAME IS NULL

如果这有助于查询的那部分,则在其他地方尝试其他类似的重写

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM