【问题标题】:Advantages of temporary tables in OracleOracle中临时表的优势
【发布时间】:2016-05-23 07:01:25
【问题描述】:

我试图弄清楚临时表的使用对 Oracle 数据库有哪些性能影响。我们希望在 ETL 过程中使用这些表来保存临时结果。目前,我们为此目的使用物理表,并在 ETL 过程开始时截断这些表。我知道截断过程非常昂贵,因此我认为使用临时表是否会更好。

有没有人体验过在这种情况下使用临时表可以提高性能?

关于 SQL Server 的这个问题只有一些答案,例如 question。但我不知道这些建议是否也适合 Oracle 数据库。

如果有人能列出此功能的优缺点,并指出此功能适用于哪些场景,那就太好了。

提前致谢。

【问题讨论】:

    标签: oracle etl


    【解决方案1】:

    首先:truncate 并不昂贵,没有条件的 delete 是非常昂贵的。 第二:你的临时表有索引吗?外键呢? 这可能会影响性能。

    临时表的工作方式或多或少有点像Sql Server(当然语法不同,就像全局临时表一样),两者都只是表。 与普通表相比,临时表不会获得任何性能提升,它们是一样的:它们在 DB 上有定义,可以有索引,并被记录。 唯一的区别是临时表是您的会话独有的(全局表除外),这意味着如果来自多个会话的多个脚本引用同一个表,则每个脚本都在读取/写入不同的表并且它们不能相互锁定(在这种情况下你可以获得性能,但我认为这种情况很少见)。

    【讨论】:

    • 我认为截断与没有 where 条件的删除具有相同的限制。感谢您的澄清。它还没有计划为这些临时表编制索引,但将来可能会出现这种情况。如果我们在处理完 etl 之后删除临时表,会有什么不同吗?什么会更好:使用临时表,因为数据库自己删除它们或使用经典表并手动删除它们?
    • 我更喜欢临时表(在小型数据集的 Sql Server 中,我通常更喜欢表变量,因为它们没有写入磁盘,但我没有使用 Oracle 中最近的亲戚的经验,这是另一回事)因为它们就是它们的意思:它们是暂时的。
    • 另外,考虑到临时表是由 Oracle 管理的,它们会以更优化的方式自动为您删除,您不必在开始之前和结束时手动进行截断,并且不会包含在备份中。这可能是一个很好的阅读:docs.oracle.com/cd/B19306_01/server.102/b14220/…
    • 感谢您提供该链接。我会看看这个。也许我们会自己测试这两种方法的性能差异。非常感谢您分享您的经验
    猜你喜欢
    • 2017-12-31
    • 2010-11-23
    • 2012-09-17
    • 2015-02-13
    • 2010-12-24
    • 2015-12-12
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多