这个让我很困惑。从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
权限的权限。