中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle 12CR2中cursor-duration臨時表怎么用

發布時間:2021-11-10 14:35:18 來源:億速云 閱讀:173 作者:小新 欄目:關系型數據庫

小編給大家分享一下Oracle 12CR2中cursor-duration臨時表怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在Oracle12C中為了物化查詢的中間結果,Oracle數據庫在查詢編譯時在內存中可能會隱式的創建一個cursor_duration臨時表。

Cursor-Duration臨時表的作用
復雜查詢有時會處理相同查詢塊多次,這將會增加不必要的性能開鎖。為了避免這種問題,Oracle數據庫可以在游標生命周期內為查詢結果創建臨時表并存儲在內存中。對于有with子句查詢,星型轉換與分組集合操作的復雜操作,這種優化增強了使用物化中間結果來優化子查詢。在這種方式下,cursor-duration臨時表提高了性能并且優化了I/O。

Cursor-Duration臨時表工作原理
cursor-definition臨時表定義內置在內存中。表定義與游標相關,并且只對執行游標的會話可見。當使用cursor-duration臨時表時,數據庫將執行以下操作:
1.選擇使用cursor-duration臨時表的執行計劃
2.創建臨時表時使用唯一名
3.重寫查詢引用臨時表
4.加載數據到內存中直到沒有內存可用,在這種情次品下將在磁盤上創建臨時段
5.執行查詢,從臨時表中返回數據
6.truncate表,釋放內存與任何磁盤上的臨時段

注意,cursor-duration臨時表的元數據只要cursor在內存中就會一直存在于內存中。元數據不會存儲在數據字典中這意味著通過數據字典視圖將不能查詢到,不能顯性地刪除元數據。上面的場景依賴于可用的內存。對于特定查詢,臨時表使用PGA內存。

cursor-duration臨時表的實現類似于排序。如果沒有可用內存,那么數據庫將把數據寫入臨時段。對于cursor-duration臨時表,主要差異如下:
.在查詢結束時數據庫釋放內存與臨時段而不是當row source不現活動時釋放。

.內存中的數據仍然存儲在內存中,不像排序數據可能在內存與臨時段之間移動。
當數據庫使用cursor-duration臨時表時,關鍵字cursor duration memory會出現在執行計劃中。

cursor-duration臨時表使用場景
一個with查詢重復相同子查詢多次可能有時使用cursor-duration臨時表性能更高,下面的查詢使用一個with子句來創建三個子查詢塊:

SQL> set long 99999
SQL> set linesize 300
SQL> with
  2  q1 as (select department_id, sum(salary) sum_sal from hr.employees group by
  3  department_id),
  4  q2 as (select * from q1),
  5  q3 as (select department_id, sum_sal from q1)
  6  select * from q1
  7  union all
  8  select * from q2
  9  union all
 10  select * from q3;
DEPARTMENT_ID    SUM_SAL
------------- ----------
          100      51608
           30      24900
                    7000
           90      58000
           20      19000
           70      10000
          110      20308
           50     156400
           80     304500
           40       6500
           60      28800
           10       4400
          100      51608
           30      24900
                    7000
           90      58000
           20      19000
           70      10000
          110      20308
           50     156400
           80     304500
           40       6500
           60      28800
           10       4400
          100      51608
           30      24900
                    7000
           90      58000
           20      19000
           70      10000
          110      20308
           50     156400
           80     304500
           40       6500
           60      28800
           10       4400
36 rows selected.

下面是優化轉換后的執行計劃

SQL> select * from table(dbms_xplan.display_cursor(format=>'basic +rows +cost'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
EXPLAINED SQL STATEMENT:
------------------------
with q1 as (select department_id, sum(salary) sum_sal from hr.employees
group by department_id), q2 as (select * from q1), q3 as (select
department_id, sum_sal from q1) select * from q1 union all select *
from q2 union all select * from q3
Plan hash value: 4087957524
----------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                       | Rows  | Cost (%CPU)|
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                            |       |     6 (100)|
|   1 |  TEMP TABLE TRANSFORMATION               |                            |       |            |
|   2 |   LOAD AS SELECT (CURSOR DURATION MEMORY)| SYS_TEMP_0FD9E08D2_620789C |       |            |
|   3 |    HASH GROUP BY                         |                            |    11 |   276   (2)|
|   4 |     TABLE ACCESS FULL                    | EMPLOYEES                  |   100K|   273   (1)|
|   5 |   UNION-ALL                              |                            |       |            |
|   6 |    VIEW                                  |                            |    11 |     2   (0)|
|   7 |     TABLE ACCESS FULL                    | SYS_TEMP_0FD9E08D2_620789C |    11 |     2   (0)|
|   8 |    VIEW                                  |                            |    11 |     2   (0)|
|   9 |     TABLE ACCESS FULL                    | SYS_TEMP_0FD9E08D2_620789C |    11 |     2   (0)|
|  10 |    VIEW                                  |                            |    11 |     2   (0)|
|  11 |     TABLE ACCESS FULL                    | SYS_TEMP_0FD9E08D2_620789C |    11 |     2   (0)|
----------------------------------------------------------------------------------------------------
26 rows selected.

在上面的執行計劃中,在步驟1中的TEMP TABLE TRANSFORMATION指示數據庫使用cursor-duration臨時表來執行查詢。在步驟2中的CURSOR DURATION MEMORY指示數據庫使用內存,如果有可用內存,將結果作為臨時表SYS_TEMP_0FD9E08D2_620789C來進行存儲。如果沒有可用內存,那么數據庫將臨時數據寫入磁盤。

看完了這篇文章,相信你對“Oracle 12CR2中cursor-duration臨時表怎么用”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铁岭县| 葫芦岛市| 盖州市| 湟源县| 出国| 濮阳市| 金门县| 肇源县| 大港区| 陇川县| 丰城市| 陇西县| 沙河市| 千阳县| 正蓝旗| 佳木斯市| 库尔勒市| 土默特左旗| 宣城市| 玉溪市| 美姑县| 巴南区| 册亨县| 新津县| 县级市| 台湾省| 伊宁市| 兴安县| 阿坝县| 肥城市| 东山县| 社会| 汉川市| 合山市| 南昌市| 屏东县| 中山市| 淮安市| 容城县| 延川县| 清水河县|