2009-08-26 35 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