我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle 12CR2中cursor-duration临时表怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle 12CR2中cursor-duration临时表怎么用

小编给大家分享一下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临时表怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle 12CR2中cursor-duration临时表怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle临时表创建怎么写

要创建一个Oracle临时表,可以使用以下语法:CREATE GLOBAL TEMPORARY TABLE 表名(列名1 数据类型1,列名2 数据类型2,…)ON COMMIT {DELETE ROWS | PRESERVE
oracle临时表创建怎么写
2024-04-09

oracle怎么创建临时表空间

在Oracle数据库中,可以使用以下步骤创建临时表空间:首先,连接到Oracle数据库并以SYS用户身份登录。创建一个新的临时表空间,可以使用以下SQL语句:CREATE TEMPORARY TABLESPACE temp_tsTEMPF
oracle怎么创建临时表空间
2024-04-09

oracle怎么查看用户临时表空间

可以使用以下语句来查看Oracle用户的临时表空间:```sqlSELECT tablespace_name, file_name, bytes/1024/1024 AS size_mbFROM dba_temp_filesWHERE ta
2023-08-31

oracle怎么释放临时表空间

要释放Oracle数据库中的临时表空间,可以按照以下步骤进行操作:1. 首先,确保当前会话没有使用该临时表空间。可以通过执行以下查询语句来查看当前会话使用的临时表空间:```SELECT s.sid, s.serial#, p.spid,
2023-09-28

Oracle怎么删除临时表空间

要删除Oracle临时表空间,您可以按照以下步骤进行操作:首先,确保没有用户正在使用临时表空间。您可以通过执行以下SQL查询来检查:SELECT username FROM v$session WHERE tablespace_name
Oracle怎么删除临时表空间
2024-04-09

sql中临时表怎么创建

创建 sql 临时表步骤如下:使用 create temporary table 语法创建表,指定表名和列定义。添加数据并对临时表进行操作,就像操作普通表一样。会话结束后,临时表将自动删除,或使用 drop table 语法手动删除。SQL
sql中临时表怎么创建
2024-05-10

oracle怎么创建临时表并传参数

在Oracle中,可以通过使用GLOBAL TEMPORARY TABLE来创建临时表并传参数。以下是创建临时表并传参数的示例代码:首先,创建一个存储过程来插入数据到临时表中,并传入参数:CREATE OR REPLACE PROCEDUR
oracle怎么创建临时表并传参数
2024-04-09

oracle怎么删除临时表空间文件

要删除Oracle临时表空间文件,您需要执行以下步骤:首先,确定哪个临时表空间文件要删除。您可以使用以下查询来查看临时表空间文件的信息:SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_TEMP_FILE
oracle怎么删除临时表空间文件
2024-04-09

oracle怎么清除临时表空间数据

要清除Oracle临时表空间中的数据,可以按照以下步骤进行操作:1. 首先,确认当前正在使用的临时表空间的名称。可以使用以下SQL查询语句来获取:```SELECT tablespace_name FROM dba_tablespaces
2023-09-15

oracle创建临时表怎么备份数据

要备份临时表的数据,可以使用以下步骤:使用CREATE TABLE语句创建一个新的表,用来存储临时表的数据备份。例如:CREATE TABLE backup_table AS SELECT * FROM temporary_table;确保
oracle创建临时表怎么备份数据
2024-04-09

Oracle中的游标Cursor怎么使用

在Oracle中,游标(Cursor)是一种用于处理结果集的数据库对象。游标可以被用来遍历和操作查询结果集中的行。以下是使用游标的基本步骤:1. 声明游标:在PL/SQL块中使用`CURSOR`关键字声明游标,指定查询语句。```sqlDE
2023-08-15

编程热搜

目录