2017-10-06 66 views
0

这是一个让我困惑的问题。从DB2拉出本身很快,并且从桌面拉出的速度很快,但我不知道为什么它们不能很好地一起玩。我无法访问DB2表或服务器的索引。Oracle缓慢地将本地表加入到DB2主机

此查询需要0.017秒:

select 
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE, 
    rank() over (partition by PART_NO order by APRV_DT asc) rnk, 
    FROM DB2_TABLE 
where PART_NO in 
    ('529711', 
    '627862', 
    '325712', 
    '979257', 
    '168570', 
    '004297') 

很显然,我不想硬编码的所有部分的数字,因为我几乎200K他们的查询。

我留下的部件号这里只是试图得到这个工作。该查询,我选择相同的6个号需要1.23秒:

select distinct PART_NUMBER from PARTS_REPORT 
where PART_NUMBER in 
    ('529711', 
    '627862', 
    '325712', 
    '979257', 
    '168570', 
    '004297') 

的问题是,当我将这些在一起:

在我的印象中,这个查询需时约3秒的东西。它需要492秒

select 
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE, 
    rank() over (partition by PART_NO order by APRV_DT asc) rnk, 
    FROM DB2_TABLE 
where PART_NO in 
(
    select distinct PART_NUMBER from PARTS_REPORT 
    where PART_NUMBER in 
     ('529711', 
     '627862', 
     '325712', 
     '979257', 
     '168570', 
     '004297') 
) 

有没有更好的方式来做到这一点?我需要索引我的PARTS_REPORT表吗?这里关键是什么?

编辑:运行所有20万上下的零件号,同样的查询需要564秒 - 围绕所花费的时间我有什么上面跑。

编辑2:下面的用户帮助我知道发生了什么事情 - 我不得不拉下整个远程表,这是缓慢的。我想我明白现在发生了什么 - 谢谢。

+0

目前尚不清楚其中的表是远程的,并且是局部的,但如果你加入远程和本地表的整个远程表有被发送到(你用'那里PART_NO in'做的)任何情况下,执行连接的本地服务器。 – mustaccio

+0

DB2_Table是远程表。所以整个表必须被提取才能加入?有没有办法解决这个问题,就像中间步骤一样? – Clint

+0

连接必须在某处发生,因此您要么在本地带来远程表,要么将本地表(或其子集)发送到远程服务器。后者大概需要更少的带宽,因此如果您有足够的Db2数据库特权,您可以声明临时表,使用Oracle表中的零件号列表加载它,然后对两个远程表执行查询,将联接本地化。 – mustaccio

回答

2

总结我的意见作为一个答案:

在第一个查询您提供一个明确的IN列表查询,所以它的全部DB2服务器上远程执行,从DB2_TABLE数据的返回。

当您尝试从本地表(您使用where PART_NO in)检索搜索条件时,您强制连接远程表和本地表,必须将整个远程表发送到本地服务器连接被执行。

发送本地表(或其子集)发送到远程服务器来执行推测该加入有需要较少的带宽。你可以通过声明一个临时表,使用Oracle表中的零件号列表加载它,然后对两个远程表执行查询,在那里对联接进行本地化。

你已经在远程数据库的一些特权,让您查询其表(S);请尝试查看您是否可以运行DECLARE GLOBAL TEMPORARY TABLE - 默认情况下,它不需要超出正常PUBLIC权限的任何权限。