oracle臨時表用法的比較
臨時表是複雜sql效能優化中常見手段,總結一下。
www.2cto.com
1) global temporary 句
分為會話級和事務級兩種。
會話級的臨時表
【語法】
create global temporary table table_name
(the aggregation sql statement) on commit preserve rows;
【特點】
臨時表資料自動清空後,但是臨時表的結構以及元資料還儲存在使用者的資料字典中。表的定義對所有的會話可見。
臨時表不需要dml鎖。 www.2cto.com
可以索引臨時表和在臨時表基礎上建立檢視。
在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效。
臨時表可以擁有觸發器。
可以用export和import工具匯入匯出臨時表的定義,但是不能匯出資料。
【適用場合】
當某乙個sql語句多表關聯,並且和一些小表關聯。可以採用將大表進行分拆並且得到比較小的結果集合存放在臨時表中。
程式執行過程中多次使用的臨時資料,這些資料在整個程式的會話過程中都需要用的等等。
【清除時點】
當某乙個session退出之後自動清除資料(表結構保留)
【不足】
不支援lob物件,這也許是設計者基於執行效率的考慮,但實際應用中確實需要此功能時就無法使用臨時表了。
不支援主外來鍵關係。
www.2cto.com
例子:
create global temporary table my_temporary
(birthdate date,
enddate date,
name char(20)) on commit preserve rows;
事務級的臨時表
【語法】
create global temporary table table_name
(the aggregation sql statement) on commit delete rows;
【清除時點】 當執行commit之後自動清除資料(表結構保留)
其他方面與會話級的臨時表相同,不再列出。
2) with句
準確的說with語句不叫臨時表,但它與臨時表使用概念上非常接近,同樣列出。
【語法】
with
subquery_name
as
(the aggregation sql statement)
select
(query naming subquery_name);
【特點】
附著於乙個sql 語句,也只對乙個sql語句產生作用。
可以同時生成幾張臨時表。
生存期極短,易於管理。
【適用場合】
global temporary 的適用場合都適用,只是針對乙個sql的場合
特別方便融入常量或集合運算結果,有簡化sql的作用。
【清除時點】
查詢完成後立即清除(資料及表結構)。
例子:
with
sum_sales as
( select /*+ materialize */
sum(quantity) all_sales from stores ),
number_stores as
( select /*+ materialize */
count(*) nbr_stores from stores ),
sales_by_store as
( select /*+ materialize */
store_name, sum(quantity) store_sales from
store natural join sales )
select
store_name
from
store,
sum_sales,
number_stores,
sales_by_store
where
store_sales > (all_sales / nbr_stores)
(注:使用/*+ materialize */讓oracle基於cost-based(基於成本)的優化策略生成臨時表。 )
ORACLE 臨時表用法
create global temporary table tablename col1 varchar2 10 col2 number on commit preserve delete rows 這種臨時表不占用表空間,而且不同的session之間互相看不到對方的資料 在會話結束後表中的資料自動...
Oracle 臨時表用法
oracle的臨時表在應用系統中有很大的作用,它可以讓使用者只能夠操作各自的資料中而互不干擾,不用擔心會破壞或影響其他session transaction的資料,這也是資料安全的一種解決方法。臨時表分為session transaction兩種,session級的臨時表資料在整個session都存...
Oracle 臨時表用法
oracle的臨時表在應用系統中有很大的作用,它可以讓使用者只能夠操作各自的資料中而互不干擾,不用擔心會破壞或影響其他session transaction的資料,這也是資料安全的一種解決方法。臨時表分為session transaction兩種,session級的臨時表資料在整個session都存...