假脱机输出查询中涉及的多个表

Posted

技术标签:

【中文标题】假脱机输出查询中涉及的多个表【英文标题】:Spool output multiple tables involved in query 【发布时间】:2020-06-02 10:05:24 【问题描述】:

我正在尝试寻找有效的方法从数据库中提取大量数据,并将其放在云平台上进行分析(由于技术原因,无法以自动化方式进行此操作)。对于大表,我想一次提取一个月数据的 CSV;但是,一个巨大的表没有日期,并且 ID 有一个前缀,所以我不能简单地获得一系列 ID。所以我想我必须加入另一张桌子。像这样的:

select * from big_table
inner join (
select * from table2 where date between to_date("'2020-04-01'","yyyy-mm-dd") and to_date("'2020-05-01'","yyyy-mm-dd") query_result
on big_table.id = query_result.id

问题是,我希望能够将此查询和内部查询的结果以 CSV 格式存储到单独的文件中。内部查询可能需要一些时间来运行(大约 8 分钟),所以理想情况下,我希望运行上面的整个查询并导出到两个位置,而不是将上面的查询和内部查询作为单独的任务运行(从而复制工作)。

这可能吗?

【问题讨论】:

【参考方案1】:

我认为您不能同时假脱机到两个位置。但是您可以创建一个临时表并使用它:

create temp table temp_table2 as
    select t2.*
    from table2 t2
    where date >= date '2020-04-01' and
          date < date '2020-05-01';

然后,您可能希望在此创建索引:

create index idx_temp_table2_id on table2(id);

然后:

select bt.*
from big_table bt join
     temp_table2 t2
     on bt.id = t2.id;

您仍然需要单独缠绕它们。

注意:table2(date) 上的简单索引可能足以加快两个查询。

【讨论】:

以上是关于假脱机输出查询中涉及的多个表的主要内容,如果未能解决你的问题,请参考以下文章

在 sqlplus 中使用假脱机运行多个查询

通过列表理解取消假脱机频率表

SPOOLing技巧(假脱机技巧)

在没有提示变量文本的情况下假脱机 sqlplus 查询

输入/输出(I/O)管理-第一节5:假脱机(SPOOLing)技术

在 Oracle 的同一个假脱机中生成输出