欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle 12CR2查詢轉(zhuǎn)換教程之cursor-duration臨時(shí)表詳解

 更新時(shí)間:2018年11月01日 10:08:05   作者:jydba  
這篇文章主要給大家介紹了關(guān)于Oracle 12CR2查詢轉(zhuǎn)換教程之cursor-duration臨時(shí)表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

下面話不多說了,來一起看看詳細(xì)的介紹吧

Cursor-Duration臨時(shí)表的作用

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

Cursor-Duration臨時(shí)表工作原理

cursor-definition臨時(shí)表定義內(nèi)置在內(nèi)存中。表定義與游標(biāo)相關(guān),并且只對執(zhí)行游標(biāo)的會(huì)話可見。當(dāng)使用cursor-duration臨時(shí)表時(shí),數(shù)據(jù)庫將執(zhí)行以下操作:

1.選擇使用cursor-duration臨時(shí)表的執(zhí)行計(jì)劃

2.創(chuàng)建臨時(shí)表時(shí)使用唯一名

3.重寫查詢引用臨時(shí)表

4.加載數(shù)據(jù)到內(nèi)存中直到?jīng)]有內(nèi)存可用,在這種情次品下將在磁盤上創(chuàng)建臨時(shí)段

5.執(zhí)行查詢,從臨時(shí)表中返回?cái)?shù)據(jù)

6.truncate表,釋放內(nèi)存與任何磁盤上的臨時(shí)段

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

cursor-duration臨時(shí)表的實(shí)現(xiàn)類似于排序。如果沒有可用內(nèi)存,那么數(shù)據(jù)庫將把數(shù)據(jù)寫入臨時(shí)段。對于cursor-duration臨時(shí)表,主要差異如下:

.在查詢結(jié)束時(shí)數(shù)據(jù)庫釋放內(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ù)庫使用cursor-duration臨時(shí)表時(shí),關(guān)鍵字cursor duration memory會(huì)出現(xiàn)在執(zhí)行計(jì)劃中。

cursor-duration臨時(shí)表使用場景

一個(gè)with查詢重復(fù)相同子查詢多次可能有時(shí)使用cursor-duration臨時(shí)表性能更高,下面的查詢使用一個(gè)with子句來創(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ù)庫使用cursor-duration臨時(shí)表來執(zhí)行查詢。在步驟2中的CURSOR DURATION MEMORY指示數(shù)據(jù)庫使用內(nèi)存,如果有可用內(nèi)存,將結(jié)果作為臨時(shí)表SYS_TEMP_0FD9E08D2_620789C來進(jìn)行存儲(chǔ)。如果沒有可用內(nèi)存,那么數(shù)據(jù)庫將臨時(shí)數(shù)據(jù)寫入磁盤。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Oracle 存儲(chǔ)過程教程

    Oracle 存儲(chǔ)過程教程

    一個(gè)簡單的oracle分頁存儲(chǔ)過程的實(shí)現(xiàn)和調(diào)用。在看了眾多的分頁存儲(chǔ)過程以后發(fā)現(xiàn)都是針對sqlserver的,而沒有oracle的,因此想寫一個(gè)關(guān)于oracle的存儲(chǔ)過程,因?yàn)槲矣玫降臄?shù)據(jù)庫是oracle。
    2009-10-10
  • Oracle中的instr()函數(shù)應(yīng)用及使用詳解

    Oracle中的instr()函數(shù)應(yīng)用及使用詳解

    這篇文章主要介紹了Oracle中的instr()函數(shù)應(yīng)用及使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • oracle獲取當(dāng)前時(shí)間,精確到毫秒并指定精確位數(shù)的實(shí)現(xiàn)方法

    oracle獲取當(dāng)前時(shí)間,精確到毫秒并指定精確位數(shù)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猳racle獲取當(dāng)前時(shí)間,精確到毫秒并指定精確位數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • oracle中distinct的用法詳解

    oracle中distinct的用法詳解

    distinct這個(gè)關(guān)鍵字來過濾掉多余的重復(fù)記錄只保留一條,但往往只用它來返回不重復(fù)記錄的條數(shù),而不是用它來返回不重記錄的所有值。其原因是distinct只有用二重循環(huán)查詢來解決,而這樣對于一個(gè)數(shù)據(jù)量非常大的站來說,無疑是會(huì)直接影響到效率的。
    2015-09-09
  • oracle 函數(shù)判斷字符串是否包含圖片格式的實(shí)例代碼

    oracle 函數(shù)判斷字符串是否包含圖片格式的實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了oracle 函數(shù)判斷字符串是否包含圖片格式的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • ORACLE常見錯(cuò)誤代碼的分析與解決(三)

    ORACLE常見錯(cuò)誤代碼的分析與解決(三)

    ORACLE常見錯(cuò)誤代碼的分析與解決(三)...
    2007-03-03
  • Oracle 臨時(shí)表空間SQL語句的實(shí)現(xiàn)

    Oracle 臨時(shí)表空間SQL語句的實(shí)現(xiàn)

    臨時(shí)表空間用來管理數(shù)據(jù)庫排序操作以及用于存儲(chǔ)臨時(shí)表、中間排序結(jié)果等臨時(shí)對象,本文主要介紹了Oracle 臨時(shí)表空間SQL語句的實(shí)現(xiàn),感興趣的可以了解一下
    2021-09-09
  • oracle11g 最終版本11.2.0.4安裝詳細(xì)過程介紹

    oracle11g 最終版本11.2.0.4安裝詳細(xì)過程介紹

    這篇文章主要介紹了oracle11g 最終版本11.2.0.4安裝詳細(xì)過程介紹,詳細(xì)的介紹了每個(gè)安裝步驟,有興趣的可以了解一下。
    2017-03-03
  • Oracle 數(shù)據(jù)庫連接查詢SQL語句

    Oracle 數(shù)據(jù)庫連接查詢SQL語句

    oracle 連接查詢分如下幾種方法,大家可以看看,整理了下oracle 內(nèi)外鏈接。
    2009-08-08
  • Oracle 數(shù)據(jù)顯示 橫表轉(zhuǎn)縱表

    Oracle 數(shù)據(jù)顯示 橫表轉(zhuǎn)縱表

    橫表轉(zhuǎn)縱表亦可用與decode意義相似的case語句實(shí)現(xiàn),原理同該語句,這里不再過多描述。
    2009-07-07

最新評論