如何在 Oracle 12CR2 中使用游标持续时间临时表

分类:编程技术 时间:2024-02-20 15:55 浏览:0 评论:0
0
小编给大家分享一下Oracle 12CR2中如何使用cursor-duration临时表。希望您读完本文后有所收获。我们一起来讨论一下吧!

为了在Oracle12C中具体化查询的中间结果,Oracle数据库可能会在编译查询时在内存中隐式创建一个cursor_duration临时表。

Cursor-Duration临时表的作用
复杂查询有时会多次处理同一个查询块,这会增加不必要的性能锁定。为了避免这个问题,Oracle数据库可以为查询结果创建临时表,并在游标生命周期内将它们存储在内存中。对于 with 子句查询、星型转换和分组集合操作的复杂操作,此优化增强了使用物化中间结果来优化子查询。通过这种方式,游标持续时间临时表可以提高性能并优化 I/O。

当前如何sor-Duration临时表的工作原理
游标定义临时表定义是建立在内存中的。表定义与游标相关联,并且仅对执行游标的会话可见。当使用cursor-duration临时表时,数据库将执行以下操作:
1.选择使用游标持续时间临时表的执行计划
2.创建临时表时使用唯一的名称
3.重写查询以引用临时表
4.将数据加载到内存中,直到没有可用内存为止,此时将在磁盘上创建一个临时段
5.执行查询并从临时表Data返回
6.截断表,释放内存和磁盘上的任何临时段

请注意,只要游标在内存中,游标持续时间临时表的元数据将始终存在于内存中。元数据不存储在数据字典中,这意味着它不会被查询无法通过数据字典视图和元数据显式删除。上述场景依赖于可用内存。对于特定查询,临时表使用 PGA 内存。

cursor-duration临时表的实现与排序类似。如果没有可用内存,数据库会将数据写入临时段。对于游标持续时间临时表,主要区别如下:
。数据库在查询结束时释放内存和临时段,而不是在行源不活动时释放内存和临时段。

。内存中的数据仍然存储在内存中,这与可以在内存和临时段之间移动的排序数据不同。
当数据库使用cursor-duration临时表时,executionintend中会出现关键字cursoruration内存。

cursor-duration临时表使用场景
多次重复同一子查询的查询有时可能会使用cursor-duration临时表执行得更好y 表。以下查询使用 with 子句创建三个子查询块:

SQL> set long 99999SQL> set linesize 300SQL> with 2 q1 as (selectdepartment_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 650060 28800 10 4400 100 516 08 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 5800020 19000 70 10 000 110 20308 50 156400 80 304500 4 0 6500 60 28800 10 440036 行已选择。

下面是优化转换后的执行计划

SQL> select * from table(dbms_xplan.display_cursor(format=>'basic +rows +cost'));PLAN_TABLE_OUTPUT--------- ------------------------------------------------------------------------------------------ --------------------- -----解释的 SQL 语句:-------------------- ----q1 as (select Department_id, sum(salary) sum_sal from hr.employeesgroup by Department_id), q2 as (select * from q1), q3 as (selectdepartment_id, sum_sal from q1) select * from q1 union all select * from q2 union all select * from q3Plan 哈希值:4087957524--------- ----------------------------- ------------------------------------------------------------------------ --------------------|身份证 |运营|姓名                                                                                         -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - - -------------| 0 |选择语句                                                                                                                                                                               sp; |哈希组依据                                                          访问完整nbsp; 9E08D2_620789C | 11 | 11 2 (0)|| 8 |看法; 2 (0)|| 10 | 10看法                                                ; 2 (0)|| 11 | 11桌子访问完全| SYS_TEMP_0FD9E08D2_620789C | 11 | 11 2 (0)|---------------------------------------------------- ----------------- ---------------------------------------------------------------- ------选择了26行。

在上面的执行计划中,步骤1中的TEMP TABLE TRANSFORMATION表示数据库使用cursor-duration临时表来执行查询。步骤 2 中的 CURSOR DURATION MEMORY 指示数据库使用内存,如果有可用内存,则将结果存储为临时表 SYS_TEMP_0FD9E08D2_620789C。如果没有可用内存,数据库会将临时数据写入磁盘。

看完这篇文章,相信您对“Oracle 12CR2中如何使用cursor-duration临时表”有了一定的了解。如果您想了解更多相关知识,请关注w行业资讯频道,感谢您的阅读!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何在 Oracle 12CR2 中使用游标持续时间临时表

用户评论