【问题标题】:SQL Oracle statement optimized with temporary table使用临时表优化的 SQL Oracle 语句
【发布时间】:2010-11-23 01:50:08
【问题描述】:

我已经使用这样的临时表优化了一个复杂的 Oracle 语句:

原创

SELECT data FROM table WHERE ..complex statement..;

优化(我不能用WITH关键字,因为我处理的是

CREATE GLOBAL TEMPORARY TABLE temptab (x NUMBER, y DATE) ON COMMIT DELETE ROWS;
INSERT INTO temptab SELECT * FROM temp;
SELECT data FROM temptab WHERE ..complex statement..;
COMMIT;

问题是:我必须在新数据库上执行这些语句。最好删除并创建临时表,或者仅在存在时截断它?我该如何处理这个额外的表?

【问题讨论】:

  • 为了完整起见:处理复杂的 Oracle 语句的另一种方法是使用 WITH 子句,例如: WITH temptab AS (SELECT * FROM temp) SELECT data FROM temptab WHERE ..complex statement.. ; - 在一个 SQL 中而不是 INSERT+SELECT 中完成工作通常会更有效。
  • 你怎么知道临时表的使用已经优化了任何东西?它们带来了巨大的开销 - 将数据写入临时表空间 - 所以通常它们只有在初始 SELECT 昂贵/和/后续处理需要多次执行该查询时才值得。在将其投入生产之前,绝对值得进行基准测试。

标签: oracle temp-tables


【解决方案1】:

临时表不会占用数据文件中的内存。临时表分配临时段的内存。会话或事务结束后释放内存。

不需要对临时表进行截断。创建一次并使用它。没有悲伤。

更多关于临时表here

【讨论】:

    【解决方案2】:

    您的临时表数据仅在事务范围内可见。

    在您提交或回滚事务(或断开连接并重新连接)后,数据消失。

    您无需在每次运行查询时都创建表:只需创建一次即可。

    Oracle 中的TRUNCATEDDL 操作(它提交它运行的事务)。

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多