Oracle将本地表加入DB2大型机的速度较慢



这个让我很困惑。从DB2中提取本身很快,从表中提取也很快,但我不知道为什么它们不能很好地配合在一起。我无法访问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')

显然,我不想硬编码所有的零件号,因为我有将近20万个零件号要查询。

我把零件号留在这里只是为了让它发挥作用。我选择相同的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表编制索引?这里的钥匙是什么?

edit:要运行所有20万个零件号,同样的查询需要564秒,大约是我上面运行的时间。

编辑2:下面的用户帮助我知道发生了什么——我必须推倒整个远程表,这很慢。我想我明白现在发生的事情了——谢谢。

总结我的评论作为答案:

在第一个查询中,您为查询提供了一个显式的IN列表,因此它在DB2服务器上整体远程执行,从DB2_TABLE返回数据。

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

将本地表(或其子集)发送到远程服务器以在那里执行联接可能需要更少的带宽。您可以通过声明一个临时表,用Oracle表中的零件号列表加载它,然后对两个远程表执行查询,并在那里本地化联接来实现这一点。

您在远程数据库中已经有一些权限,可以查询其表;试着看看是否可以运行DECLARE GLOBAL TEMPORARY TABLE——默认情况下,它不需要任何超出正常PUBLIC权限的权限。

最新更新