0

这个让我很困惑。单独从 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')

显然我不想硬编码所有的零件号,因为我有将近 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 表吗?这里的关键是什么?

编辑:要运行所有 200k-ish 部件号,相同的查询需要 564 秒 - 大约是我上面运行的时间。

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

4

1 回答 1

2

总结我的评论作为答案:

在您的第一个查询中,您为查询提供了一个显式IN列表,因此它在 DB2 服务器上完整地远程执行,从DB2_TABLE.

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

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

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

于 2017-10-06T16:22:09.747 回答