2009-08-26 43 views
1

我已经优化使用临时表中的复杂的Oracle声明是这样的:与临时表优化的SQL语句的Oracle

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

优化(我也无法使用关键字,因为我处理的是Oracle9i)<:

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;

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

+0

只是为了完整:处理复杂Oracle语句的另一种方法是使用WITH子句,例如:WITH temptab AS(SELECT * FROM temp)SELECT data FROM temptab WHERE ..complex语句..; - 在一个SQL而不是INSERT + SELECT中完成工作通常会更高效。 – 2009-08-27 11:32:03

+0

你怎么知道使用临时表已经优化了任何东西?它们带来了巨大的开销 - 将数据写入临时表空间 - 所以一般来说,它们只有在初始SELECT代价高昂时/ /后续处理需要多次执行该查询才值得。在投入生产之前,这绝对值得您进行基准测试。 – APC 2009-08-30 09:31:21

回答

4

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

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

每次运行查询时都不需要创建表格:只需创建一次即可。

TRUNCATE in Oracle是一个DDL操作(它提交它运行的事务)。

+0

+1:一劳永逸地创造它 – 2009-08-26 16:20:48

0

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

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

更多关于临时表here