溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle 12CR2中cursor-duration臨時(shí)表怎么用

發(fā)布時(shí)間:2021-11-10 14:35:18 來(lái)源:億速云 閱讀:165 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫(kù)

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

在Oracle12C中為了物化查詢的中間結(jié)果,Oracle數(shù)據(jù)庫(kù)在查詢編譯時(shí)在內(nèi)存中可能會(huì)隱式的創(chuàng)建一個(gè)cursor_duration臨時(shí)表。

Cursor-Duration臨時(shí)表的作用
復(fù)雜查詢有時(shí)會(huì)處理相同查詢塊多次,這將會(huì)增加不必要的性能開(kāi)鎖。為了避免這種問(wèn)題,Oracle數(shù)據(jù)庫(kù)可以在游標(biāo)生命周期內(nèi)為查詢結(jié)果創(chuàng)建臨時(shí)表并存儲(chǔ)在內(nèi)存中。對(duì)于有with子句查詢,星型轉(zhuǎn)換與分組集合操作的復(fù)雜操作,這種優(yōu)化增強(qiáng)了使用物化中間結(jié)果來(lái)優(yōu)化子查詢。在這種方式下,cursor-duration臨時(shí)表提高了性能并且優(yōu)化了I/O。

Cursor-Duration臨時(shí)表工作原理
cursor-definition臨時(shí)表定義內(nèi)置在內(nèi)存中。表定義與游標(biāo)相關(guān),并且只對(duì)執(zhí)行游標(biāo)的會(huì)話可見(jiàn)。當(dāng)使用cursor-duration臨時(shí)表時(shí),數(shù)據(jù)庫(kù)將執(zhí)行以下操作:
1.選擇使用cursor-duration臨時(shí)表的執(zhí)行計(jì)劃
2.創(chuàng)建臨時(shí)表時(shí)使用唯一名
3.重寫(xiě)查詢引用臨時(shí)表
4.加載數(shù)據(jù)到內(nèi)存中直到?jīng)]有內(nèi)存可用,在這種情次品下將在磁盤(pán)上創(chuàng)建臨時(shí)段
5.執(zhí)行查詢,從臨時(shí)表中返回?cái)?shù)據(jù)
6.truncate表,釋放內(nèi)存與任何磁盤(pán)上的臨時(shí)段

注意,cursor-duration臨時(shí)表的元數(shù)據(jù)只要cursor在內(nèi)存中就會(huì)一直存在于內(nèi)存中。元數(shù)據(jù)不會(huì)存儲(chǔ)在數(shù)據(jù)字典中這意味著通過(guò)數(shù)據(jù)字典視圖將不能查詢到,不能顯性地刪除元數(shù)據(jù)。上面的場(chǎng)景依賴于可用的內(nèi)存。對(duì)于特定查詢,臨時(shí)表使用PGA內(nèi)存。

cursor-duration臨時(shí)表的實(shí)現(xiàn)類似于排序。如果沒(méi)有可用內(nèi)存,那么數(shù)據(jù)庫(kù)將把數(shù)據(jù)寫(xiě)入臨時(shí)段。對(duì)于cursor-duration臨時(shí)表,主要差異如下:
.在查詢結(jié)束時(shí)數(shù)據(jù)庫(kù)釋放內(nèi)存與臨時(shí)段而不是當(dāng)row source不現(xiàn)活動(dòng)時(shí)釋放。

.內(nèi)存中的數(shù)據(jù)仍然存儲(chǔ)在內(nèi)存中,不像排序數(shù)據(jù)可能在內(nèi)存與臨時(shí)段之間移動(dòng)。
當(dāng)數(shù)據(jù)庫(kù)使用cursor-duration臨時(shí)表時(shí),關(guān)鍵字cursor duration memory會(huì)出現(xiàn)在執(zhí)行計(jì)劃中。

cursor-duration臨時(shí)表使用場(chǎng)景
一個(gè)with查詢重復(fù)相同子查詢多次可能有時(shí)使用cursor-duration臨時(shí)表性能更高,下面的查詢使用一個(gè)with子句來(lái)創(chuàng)建三個(gè)子查詢塊:

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.

下面是優(yōu)化轉(zhuǎn)換后的執(zhí)行計(jì)劃

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.

在上面的執(zhí)行計(jì)劃中,在步驟1中的TEMP TABLE TRANSFORMATION指示數(shù)據(jù)庫(kù)使用cursor-duration臨時(shí)表來(lái)執(zhí)行查詢。在步驟2中的CURSOR DURATION MEMORY指示數(shù)據(jù)庫(kù)使用內(nèi)存,如果有可用內(nèi)存,將結(jié)果作為臨時(shí)表SYS_TEMP_0FD9E08D2_620789C來(lái)進(jìn)行存儲(chǔ)。如果沒(méi)有可用內(nèi)存,那么數(shù)據(jù)庫(kù)將臨時(shí)數(shù)據(jù)寫(xiě)入磁盤(pán)。

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI