问题描述
简单描述临时表的存储特点。
临时表的数据存储在临时表空间中,这一点很显然,不过为什么临时表在DBA_TABLES视图中显示的表空间为空,以前确实一直不是很清楚。
前两天在和KAMUS讨论临时表的实现时,突然意识到这一点,由于临时表可以被多个用户访问,而不同用户的默认临时表空间的设置可能不同,这就意味着临时表的多个临时段可能存储在多个临时表空间中,正是这个原因,导致了临时表对应的表空间信息为空。
专家解答
下面这个简单的例子说明了这种情况:
SQL> CONN / AS SYSDBA 已连接。 SQL> SET PAGES 100 LINES 120 SQL> COL FILE_NAME FORMAT A50 SQL> SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_TEMP_FILES; TABLESPACE_NAME FILE_NAME ------------------------------ --------------------------------------------- TEMP D:\ORACLE\ORADATA\YTK102\TEMP01.DBF SQL> SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME = 'TEST'; USERNAME TEMPORARY_TABLESPACE ------------------------------ ------------------------------ TEST TEMP SQL> CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE 'D:\ORACLE\ORADATA\YTK102\TEMP201.DBF' SIZE 100M; 表空间已创建。 SQL> CREATE USER TEST2 IDENTIFIED BY TEST2 TEMPORARY TABLESPACE TEMP2; 用户已创建。 SQL> GRANT CREATE SESSION TO TEST2; 授权成功。 SQL> CONN TEST/TEST 已连接。 SQL> CREATE GLOBAL TEMPORARY TABLE TMP1 (ID NUMBER); 表已创建。 SQL> GRANT ALL ON TMP1 TO TEST2; 授权成功。 SQL> CONN TEST2/TEST2 已连接。 SQL> INSERT INTO TEST.TMP1 VALUES (1); 已创建 1 行。 SQL> CONN TEST/TEST 已连接。 SQL> INSERT INTO TMP1 VALUES (2); 已创建 1 行。 SQL> ALTER TABLESPACE TEMP2 TEMPFILE OFFLINE; 表空间已更改。 SQL> CONN TEST/TEST 已连接。 SQL> INSERT INTO TMP1 VALUES (3); 已创建 1 行。 SQL> CONN TEST2/TEST2 已连接。 SQL> INSERT INTO TEST.TMP1 VALUES (4); INSERT INTO TEST.TMP1 VALUES (4) * 第 1 行出现错误: ORA-01652: 无法通过 128 (在表空间 TEMP2 中) 扩展 temp 段
各个会话在访问临时表的时候,都会拥有自己独立的临时表段,而当多个用户的默认临时表空间不同时,临时表就可能在多个临时表空间上建立临时段,正是这个原因使得临时段的表空间属性无法确定。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。