【问题标题】:Load data in a Global Temporary Table在全局临时表中加载数据
【发布时间】:2011-05-17 09:36:38
【问题描述】:

我在同一个 Oracle 用户上有两个不同的 Oracle 会话(“会话 A”和“会话 B”)。

在“会话 A”中填充了一个全局临时表,其中包含大约 320,000 条记录。

如何在“会话B”的全局临时表中快速插入同样的32万条记录?

提前感谢您的友好建议!

编辑:我忘记指定只允许创建全局临时表。

编辑:我忘记指定不允许创建数据库链接

【问题讨论】:

  • 您可以改为创建一个可供两个会话访问的表...更多信息会有所帮助 - 什么版本的 Oracle,以及为什么需要临时表?
  • 我只能创建全局临时表...
  • 我使用的Oracle版本是:Oracle Database 10G Release 2
  • 有什么理由不允许您使用“常规”表格?
  • 如果您有合法的需要在生产数据库中创建一个临时表(就 Oracle 而言,它是一个包含临时数据的永久表)并针对该生产数据库运行一个进程,那么几乎可以肯定是创建永久表的充分理由。 DBA 通常会询问创建新表的理由,并且可能希望将您的表放在单独的模式和/或表空间中,但是如果这是最有效的方法,那么您不使用永久表的限制是没有意义的您可以创建一个临时表。

标签: sql oracle temp-tables


【解决方案1】:

临时表中的数据只对当前会话可见,所以我认为没有其他方法可以做你想做的事情。

【讨论】:

    【解决方案2】:

    DBMS_PIPE 是将信息从一个会话推送到另一个会话的“经典”机制。会话 A 必须将数据推送到管道中,而会话 B 必须将其拉出。

    但一般来说,数据库的想法是会话是独立的,任何共性都在保存的数据中。与此相反表明您使用了错误的工具。

    【讨论】:

    • 好的,你能举例说明如何使用 PUSH 和 PULL 将记录从“会话 A”传输到“会话 B”吗?请假设“Session A”中的源表和“Session B”中的目标表是相同的表。
    【解决方案3】:

    全局临时表中的数据仅对插入它的会话可见。因此,您必须运行在会话 B 中填充表的相同进程。

    当然,您似乎希望在两个不同的会话中访问相同的 320,000 行,这似乎意味着全局临时表不是要使用的适当数据结构。也许您想将该数据加载到永久表中(如果您将有多个 SessionA/SessionB 对,则可能连同某种标识符一起)。或者,会话 B 运行的任何逻辑都应该由会话 A 运行。

    而且退一步说,由于 Oracle 实现了多版本读取一致性,因此读取器不会阻塞写入器,写入器不会阻塞读取器,因此需要在数据库中拥有 320,000 行的临时表是非常不寻常的。第一名。

    【讨论】:

    • 好的,但是假设我不允许创建物理表(但只能创建全局临时表),并且不允许我创建 DBLINK,您认为最快的方法是什么?复制“会话 B”中的 320,000 行?
    • 会话 A 在哪里获取 320,000 行以插入到临时表中?数据库链接在哪里发挥作用?会话 A 和会话 B 是否也在两个不同的数据库上?
    • 320,000 行来自一个长查询。这个结果必须与另一个全局临时表的另一个会话中的类似结果相结合。我在两个会话中运行相同的过程,以并行执行并缩短执行时间。
    • 我们想出的将数据从一个会话中的全局临时表移动到另一个会话中的全局临时表的任何机制几乎肯定需要更多的时间来移动数据,而不是手动并行化所节省的时间查询。所以最后,你几乎肯定最好不要拆分查询,而只是具体化 Session A 表中的 640,000 行。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2017-10-02
    • 2023-03-27
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多