为了实现查询的中间结果,Oracle数据库可以在查询编译期间在内存中隐式创建游标持续时间临时表。
5.9.1游标持续时间临时表的目的
复杂查询有时会多次处理同一查询块,这会产生不必要的性能开销。
为避免这种情况,Oracle数据库可以自动为查询结果创建临时表,并在游标期间将它们存储在内存中。对于WITH子句查询,星形转换和分组集之类的复杂操作,此优化可增强重复使用的子查询产生的中间结果的实现。这样,游标持续时间临时表可以提高性能并优化I / O。
5.9.2游标持续时间临时表如何工作
游标定义临时表的定义位于内存中。表定义与游标相关联,并且仅对执行游标的会话可见。
使用游标持续时间临时表时,数据库执行以下步骤:
- 选择一个使用游标持续时间临时表的计划
- 使用唯一名称创建临时表
- 重写查询以引用临时表
- 将数据加载到内存中,直到没有剩余内存为止,在这种情况下,它将在磁盘上创建临时段
- 执行查询,从临时表返回数据
- 截断表,释放内存和任何磁盘上的临时段
注意:只要游标在内存中,游标持续时间临时表的元数据就会保留在内存中。
元数据未存储在数据字典中,这意味着它在数据字典视图中不可见。您不能显式删除元数据。
上述情况取决于内存的可用性。对于串行查询,临时表使用PGA内存。
游标持续时间临时表的实现类似于排序。如果没有更多的可用内存,则数据库会将数据写入临时段。对于游标持续时间临时表,区别如下:
- 数据库在查询结束时释放内存和临时段,而不是在行资源不活动状态时释放。
- 内存中的数据保留在内存中,这与数据可以在内存和临时段之间移动的排序不同。
当数据库使用游标持续时间临时表时,关键字将 CURSOR DURATION MEMORY出现在执行计划中。
5.9.3游标持续时间临时表:示例
WITH那重复相同的子查询的查询有时可以从光标持续时间的临时表中受益。
以下查询使用WITH子句创建三个子查询块:
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;以下样本计划显示了转换:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'BASIC +ROWS +COST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
| Id | Operation | Name |Rows |Cost (%CPU)|
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | |6 (100)|
| 1 | TEMP TABLE TRANSFORMATION | | | | <-----------使用游标持续时间临时表来执行查询
| 2 | LOAD AS SELECT (CURSOR DURATION MEMORY) | SYS_TEMP_0FD9D6606_1AE004 | | |
| 3 | HASH GROUP BY | | 11 | 3 (34)|
| 4 | TABLE ACCESS FULL | EMPLOYEES | 107 | 2 (0) |
| 5 | UNION-ALL | | | |
| 6 | VIEW | | 11 | 2 (0) |
| 7 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6606_1AE004 | 11 | 2 (0) |
| 8 | VIEW | | 11 | 2 (0) |
| 9 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6606_1AE004 | 11 | 2 (0) |
| 10 | VIEW | | 11 | 2 (0) |
| 11 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6606_1AE004 | 11 | 2 (0) |
--------------------------------------------------------------------------------------------在前面的计划中,步骤1 TEMP TABLE TRANSFORMATION指示数据库使用游标持续时间临时表来执行查询。
步骤2 CURSOR DURATION MEMORY 中的关键字指示数据库使用了内存(如果有)来存储的结果SYS_TEMP_0FD9D6606_1AE004。如果没有可用的内存,则数据库将临时数据写入磁盘。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




