现在的位置: 首页 > 综合 > 正文

oracle临时表

2013年02月23日 ⁄ 综合 ⁄ 共 7351字 ⁄ 字号 评论关闭

http://hi.baidu.com/edeed/item/ae7b3bb5e5b90b75254b099d

Temp Table 的特点:

(1) 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的 Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
(2) 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。

Temp Table 数据的时效性:

(1)On Commit Delete Rows: 数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了(当前session);

(2)On Commit Preserve Rows :数据在 Session 期间有效,一旦关闭了Session 或 Log Off 后,数据就被 ORACLE 自动 Truncate 掉(当前session)。

 

备注:“多用户独立性”  无论是commit还是exit,清除的数据只是当前session中修改的数据。同一个临时表Temp_A,在不同的session中,seesion_A中insert50条,Session_B中insert100条,在session_A中查到的是50条,在Session_B中查的的是100条;Session_A中commit或exit只会清空Session_A中的50条记录而不会影响Session_B;同样Session_B中也不会影响Session_A;同样session_C中是查不到数据的。

CREATE GLOBAL TEMPORARY TABLE tt_user_objects1
   ON COMMIT PRESERVE ROWS
   AS SELECT * FROM user_objects;

CREATE GLOBAL TEMPORARY TABLE tt_user_objects2
   ON COMMIT DELETE ROWS
   AS SELECT * FROM user_objects;

(3.)向临时表中插入数据产生的redolog量要比向堆表中插入数据产生的redolog量要少。

SQL> insert into tt_user_objects12 SELECT * FROM user_objects;

1452 rows created.

Statistics
----------------------------------------------------------
          0  recursive calls
        198  db block gets
        825  consistent gets
          0  physical reads
     159928  redo size
        830  bytes sent via SQL*Net to client
        749  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       1452  rows processed

SQL> insert into tt_user_objects1 SELECT * FROM user_objects;

1452 rows created.

Statistics
----------------------------------------------------------
          0  recursive calls
        106  db block gets
        817  consistent gets
          0  physical reads
       7984  redo size
        830  bytes sent via SQL*Net to client
        748  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       1452  rows processed

如果报错

Execution Plan
----------------------------------------------------------
ERROR:
ORA-01039: insufficient privileges on underlying objects of the view

SP2-0612: Error generating AUTOTRACE EXPLAIN report

需要权限

grant select any dictionary to ydqxn;

问题

1.为什么向临时表插入数据产生的redo size比堆表小?

2.向临时表插入数据不产生redo log吗?

“对临时表的操作可以回滚,所以会有undo;
所有undo都受到redo的保护,就是说假设此时数据库崩溃了,下次启动会利用redo把这些undo再次还原出来,然后利用这些undo进行反操作,撤销上次那个崩溃的事务。这些undo里面可能有普通表的,也有临时表的,反正redo都会把它们恢复出来。”

http://www.itpub.net/thread-1301065-1-1.html

SQL> select count(*) from TT_USER_OBJECTS1;
 
  COUNT(*)
----------
         0
SQL> select * from dba_objects where object_name ='TT_USER_OBJECTS1';
 
OWNER                          OBJECT_NAME                                                                      SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED     LAST_DDL_TIME TIMESTAMP           STATUS  TEMPORARY GENERATED SECONDARY
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------- ----------- ------------- ------------------- ------- --------- --------- ---------
YDQXN                          TT_USER_OBJECTS1                                                                                                     88575                TABLE               2012/12/11  2012/12/11 12 2012-12-11:12:37:55 VALID   Y         N         N
SQL> select * from dba_segments where segment_name ='TT_USER_OBJECTS1';
 
OWNER                          SEGMENT_NAME                                                                     PARTITION_NAME                 SEGMENT_TYPE       TABLESPACE_NAME                HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ----------- ------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------------ -----------
SQL> select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
  2    from v$sort_usage sort, v$session sess, v$sql sql
  3   where sort.SESSION_ADDR = sess.SADDR
  4     and sql.ADDRESS = sess.SQL_ADDRESS
  5   order by blocks desc
SQL>  select tablespace_name,total_blocks,used_blocks,free_blocks from v$sort_segment;
 
TABLESPACE_NAME                 TOTAL_BLOCKS USED_BLOCKS FREE_BLOCKS
------------------------------- ------------ ----------- -----------
TEMP                                  214272           0      214272
YDQXTEMP                              424576         768      423808
 
SQL> --insert前的零时表空间大小
SQL> 
SQL> insert into tt_user_objects1 SELECT * FROM user_objects;
 
1452 rows inserted
SQL> select count(*) from TT_USER_OBJECTS1;
 
  COUNT(*)
----------
      1452
SQL> select * from dba_objects where object_name ='TT_USER_OBJECTS1';
 
OWNER                          OBJECT_NAME                                                                      SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED     LAST_DDL_TIME TIMESTAMP           STATUS  TEMPORARY GENERATED SECONDARY
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------- ----------- ------------- ------------------- ------- --------- --------- ---------
YDQXN                          TT_USER_OBJECTS1                                                                                                     88575                TABLE               2012/12/11  2012/12/11 12 2012-12-11:12:37:55 VALID   Y         N         N
SQL> select * from dba_segments where segment_name ='TT_USER_OBJECTS1';
 
OWNER                          SEGMENT_NAME                                                                     PARTITION_NAME                 SEGMENT_TYPE       TABLESPACE_NAME                HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ----------- ------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------------ -----------
SQL> select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
  2    from v$sort_usage sort, v$session sess, v$sql sql
  3   where sort.SESSION_ADDR = sess.SADDR
  4     and sql.ADDRESS = sess.SQL_ADDRESS
  5   order by blocks desc
SQL>  select tablespace_name,total_blocks,used_blocks,free_blocks from v$sort_segment;
 
TABLESPACE_NAME                 TOTAL_BLOCKS USED_BLOCKS FREE_BLOCKS
------------------------------- ------------ ----------- -----------
TEMP                                  214272           0      214272
YDQXTEMP                              424576         896      423680
--insert后的零时表空间大小SQL
> commit; 
Commit complete 
SQL> 
SQL> select count(*) from TT_USER_OBJECTS1;
 COUNT(*)
---------- 
0
SQL> select * from dba_objects where object_name ='TT_USER_OBJECTS1'; 
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS TEMPORARY GENERATED SECONDARY
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------- ----------- ------------- ------------------- ------- --------- --------- ---------YDQXN TT_USER_OBJECTS1 88575 TABLE 2012/12/11 2012/12/11 12 2012-12-11:12:37:55 VALID Y N NSQL> select * from dba_segments where segment_name ='TT_USER_OBJECTS1'; OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------ ----------- ------------ ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------------ -----------SQL> select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text 2 from v$sort_usage sort, v$session sess, v$sql sql 3 where sort.SESSION_ADDR = sess.SADDR 4 and sql.ADDRESS = sess.SQL_ADDRESS 5 order by blocks descSQL> select tablespace_name,total_blocks,used_blocks,free_blocks from v$sort_segment; TABLESPACE_NAME TOTAL_BLOCKS USED_BLOCKS FREE_BLOCKS------------------------------- ------------ ----------- -----------TEMP 214272 0 214272YDQXTEMP 424576 768 423808 SQL> 
--insert后commit的零时表空间大小


抱歉!评论已关闭.