当 Oracle 在执行一些 SQL 时,会需要一些临时空间来存储执行时产生的中间数据。这些临时空间由 Orac le
从指定的临时表空间中分配给进程。主要有三种情况会占用临时空间:临时表/索引操作、排序和临时 LO B
对象操作。
A.临时表/索引:
在会话中,当第一次对临时表进行 INSERT(包括 CTAS)时 ,Orac le 会从临时表空间中为临时表
及其索引分配临时空间一存储数据。
B.排序:
任何会使用到排序的操作,包括 JOIN、创建(重建)INDEX、ORDER BY、聚合计算(GROUP
BY)以及统计数据收集,都可能使用到临时表空间。排序操作首先会选择在内存中的 Sort Area
进行(Sort In Memory),一旦 Sort Area 不足,则会使用临时空间进行排序操作(Sort In Disk)。
看下面的例子:
SQL> alter session set sort_area_size = 10000000;
Session altered.
SQL> select owner, object_name from t_test1 order by objec t_id;
47582 rows selected.
Exec ution Plan
Plan hash value : 1312425564
Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 1 | SORT ORDER BY | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 2 | TABLE ACCESS FULL| T_TEST1 | 47582 | 1486K| 150 (1)| 00:00:02 |
Statistics
1 recursive calls
0 db block gets
658 c onsistent gets
0 physic al reads
0 redo size
1566184 bytes sent via SQL*Net to c lient
35277 bytes received via SQL*Net from client
3174 SQL*Net roundtrips to/from c lient
1 sorts (memory)
0 sorts (disk)
47582 rows processed
SQL> alter session set sort_area_size = 10000;
Session altered.
SQL> select owner, object_name from t_test1 order by objec t_id;
47582 rows selected.
Exec ution Plan
Plan hash value : 1312425564
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time|
| 0 | SELECT STATEMENT | | 47582 | 1486K| | 1251 (1)| 00:00:16 |
| 1 | SORT ORDER BY | | 47582 | 1486K| 4136K| 1251 (1)| 00:00:16 |
| 2 | TABLE ACCESS FULL| T_TEST1 | 47582 | 1486K| | 150 (1)| 00:00:02 |
Statistics
6 recursive calls
20 db bloc k gets
658 c onsistent gets
629 physical reads
0 redo size
1566184 bytes sent via SQL*Net to c lient
35277 bytes received via SQL*Net from client
3174 SQL*Net roundtrips to/from c lient
0 sorts (memory)
1 sorts (disk)
47582 rows processed
C.临时 LOB 对象:
LOB 对象包括 BLOB、CLO B、NCLOB、和 BFILE。在 PLSQL 程序块中,如果定义了 LOB 变量,
则这些 LOB 变量就是临时 LOB 对象。临时 LOB 对象被创建在临时表空间上,直到 LOB 数据被
释放,或者会话结束。