0

我有一个繁重的查询,它将数据假脱机到发送给用户的 csv 文件中。我已经手动创建了并行会话,并正在使用过滤条件执行查询,以便我可以将最后的所有假脱机文件合并到一个文件中,从而减少生成数据的时间(通常需要大约 10 个小时,并行会话需要2.5-3 小时)。

我的问题是如何自动执行此操作,以便脚本找出 max(agreementid),然后将其分发到 X 个假脱机调用中以生成 X 个文件,其中每个文件将具有最大 100000 条记录。

附加说明:我想我的问题不是很清楚。我会再次尝试解释。

  1. 我有一个包含大量数据的表/视图。
  2. 我需要将这些数据假脱机到一个 CSV 文件中。
  3. 假脱机 CSV 文件需要大量时间。
  4. 我通过执行以下操作来运行并行线轴。a) 选择 .... from ... 其中协议 ID 介于 1 到 1000000 之间;b) 选择 .... from ... 其中协议 ID 介于 1000001 到 2000000 之间;依此类推,然后在多个会话中单独假脱机。
  5. 这有助于我生成多个文件,然后我可以将它们拼接在一起并与用户共享。
  6. 我需要一个脚本(我猜是基于 dos 或基于 AIX),它将从我的表中找到协议 ID 的最小值和最大值,并自动创建假脱机脚本并通过单独的 sql 会话执行它们,以便我自动生成文件。

不知道我是否能让自己足够清楚。感谢大家回复我之前的查询,但那不是我在看的。

4

2 回答 2

2

有点不清楚你想要什么,但我认为你想要一个查询来为 x 组 id(桶)找到一个低/高范围的协议 ID。如果是这样,请尝试类似(在此示例中使用 4 个存储桶):

select bucket, min(agreement_id), max(agreement_id), count(1)
from (
  select agreement_id, ntile(4) over (order by agreement_id) bucket
  from my_table
)
group by bucket;

编辑:如果您的问题在于假脱机多个查询和组合,我宁愿选择创建单个物化视图(在驱动表上的底层查询中使用并行)并在需要时刷新(完成,atomic_refresh=>false)。刷新后,只需从快照表中提取(到 csv 或您想要的任何格式)。

于 2013-08-05T16:42:25.423 回答
1

可能有一种更简单的方法,但这会生成四个 ID 的“桶”,您可以将最小值和最大值插入参数化过滤条件:

select bucket, min(agreementid) as min_id, max(agreementid) as max_id
from (
    select agreementid,
        case when rn between 1 and cn / 4 then 1
            when rn between (cn / 4) - 1 and 2 * (cn / 4) then 2
            when rn between (2 * cn / 4) - 1 and 3 * (cn / 4) then 3
            when rn between (3 * cn / 4) - 1 and cn then 4
        end as bucket
    from (
        select agreementid, rank() over (order by agreementid) as rn,
            count(*) over () as cn from agreements
    )
)
group by bucket;

如果您想要每个桶的上限而不是固定数量的桶,那么您可以这样做:

select floor(rn / 100000), min(agreementid) as min_id, max(service_num) as max_id
from (
    select agreementid, rank() over (order by agreementid) as rn
    from agreements
)
group by floor(rn / 100000);

然后将每个最小值/最大值传递给 SQL 脚本,例如从调用 SQL*Plus 的 shell 脚本。桶号也可以通过位置参数传递并用作假脱机文件名的一部分。

不过,我很好奇您确定的瓶颈是什么;您是否尝试过在数据库中将其作为并行查询运行并/*+ PARALLEL */提示?

于 2013-08-05T14:48:35.867 回答