天天看點

臨時表空間,臨時表,臨時檔案

臨時表空間

    建立臨時表空間:create temporary tablespace temp01

                            tempfile  '/u01/app/oracle/product/9.2.0/oradata/demo/tempts01.dbf' 

                            size 100m

                            [uniform size 128k |autoallocate];

   顯示臨時表空間包含的檔案:

                    select file_name, bytes, maxbytes, autoextensible

                    from dba_temp_files

                    where tablespace_name='temp01';

   顯示臨時檔案動态資訊:

                    select name, status,enabled from  v$tempfile;    

臨時表

    1 臨時表用于儲存事務或會話期間的中間結果集。

    2 臨時表的兩種類型:

        基于會話的臨時表:在會話斷開之間,或者通過delete或truncate實體地删除行之前,資料一直存在于臨時表中

                         create global temporary table temp_table_session

                                on commit preserve rows

                                as 

                                select * from scott.emp where 1=0;

        基于事務的臨時表:在會話送出事務時,臨時表中的行就不見了。

                         create global temporary table temp_table_transaction

                                on commit delete rows

                                as

                                select * from scott.emp where 1=0;                                                

    3 兩種類型的臨時表都必須手工建立,手工使用,沒有任何操作會自動使用臨時表。

    4 臨時表的建立動作不涉及存儲空間配置設定,隻有當應用中的會話第一次在臨時表中插入資料時才會為該會話的臨時表 建立一個臨時段(即從該使用者所擁有的臨時表空間配置設定存儲)。

    5 不要在運作時在你的存儲過程中建立表。這不是oracle中使用臨時表的正确做法。而應該像永久表一樣,作為應用 安裝的一部分将所有全局臨時表隻建立一次。

    6 不要試圖利用臨時表去分解一個聯結幾個表的"大"查詢,不要想着你比優化器更聰明。

    7 臨時表可以有永久表的許多屬性。如觸發器,檢查限制,索引,但不支援:

      引用完整性,nested table 類型的列,iot,cluster,分區,analyze 指令.

臨時檔案:當執行排序操作時,伺服器程序首先會将資料放到pga區,當pga區不中以存放臨時資料時,伺服器程序就會建 立臨時段,并将這些臨時資料放到臨時段中。oracle使用臨時檔案來存儲大規模排序操作和散列操作的中間結果。還會用臨時檔案存儲全局臨時表資料,或結果集。永久資料對象不會存儲在臨時檔案中,但是臨時表及其 索引的内容要存儲在臨時檔案中。

臨時檔案與redo/undo

        臨時表不會為它們的塊生成redo,對臨時表的操作是不可恢複的。不過臨時表會生成undo,就像普通表一樣。而 undo總受redo的保護,即undo資料就像表資料或索引資料一樣,對undo的修改會生成一些redo,而這些redo會記 入日志。是以臨時表也會生成一些redo。

關于臨時表上的dml活動,有以下結論:

        insert會生成很少甚至不生成undo/redo

        delere在臨時表上生成的redo與在普通表上生成的redo同樣多

        臨時表的update會生成普通表update一半的redo.

存在問題:                 

    在oracle中,臨時表一定存在。不手工建立(兩種類型的臨時表)也存在嗎?顯然不可能,

    預設情況下的臨時表是什麼類型的。基于事務的

以上内容轉載自:http://blog.chinaunix.net/u2/72470/showart_1778374.html