我試圖將存儲過程中使用的永久錶轉換爲全局臨時表。我查看了這些永久表上的統計信息,其中一些數據有數千萬行數據,並且在大小爲千兆字節(高達10 GB)時處於訂單狀態。Oracle 10g臨時表
所以,
CREATE TABLE my_table (
column1 NUMBER,
column2 NUMBER,
etc...
)
TABLESPACE BIGTABLESPACE
NOLOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
應該成爲
CREATE GLOBAL TEMPORARY TABLE my_table (
column1 NUMBER,
column2 NUMBER,
etc..
)
ON COMMIT PRESERVE ROWS;
我創建與應予以保留,直到每個現有的永久表中的會話結束行等效全局臨時表。這個全局臨時表將在過程中使用,而不是永久表。
(EXECUTE IMMEDIATE 'TRUNCATE ...'
在開始和INSERT /*+ APPEND */ INTO
在稍後的某個點)
所有永久表都在一個大的表空間中創建BIGTABLESPACE
的全局臨時表將在被創建的Oracle文檔狀態用戶的臨時表空間(我認爲這是TEMP
)。與此問題是TEMP表空間很小,並且範圍未設置爲在過程中增長到我需要它們增長的大小。
的TEMP
表空間數據庫創建
create database "$oracle\_sid"
user sys identified by "$sys\_password"
user system identified by "$system\_password"
set default bigfile tablespace
controlfile reuse
maxdatafiles 256
maxinstances $maxinstances
maxlogfiles 16
maxlogmembers 3
maxloghistory 1600
noarchivelog
character set WE8MSWIN1252
national character set AL16UTF16
datafile
'$oracle\_home/oradata/$oracle\_sid/system01.dbf' size 512M
logfile
'$oracle\_home/oradata/$oracle\_sid/redo01.log' size 1G,
'$oracle\_home/oradata/$oracle\_sid/redo02.log' size 1G,
'$oracle\_home/oradata/$oracle\_sid/redo03.log' size 1G
sysaux datafile
'$oracle\_home/oradata/$oracle\_sid/sysaux01.dbf' size 256M
default temporary tablespace temp tempfile
'$oracle\_home/oradata/$oracle\_sid/temp01.dbf' size 5G
undo tablespace "UNDOTBS1" datafile
'$oracle\_home/oradata/$oracle\_sid/undotbs01.dbf' size 5G;
永久表中創建(即我打算替換)表中的最初創建BIGTABLESPACE
-- 50G bigfile datafile size
create bigfile tablespace "BIGTABLESPACE"
datafile '$oracle\_home/oradata/$oracle\_sid/bts01.dbf' size 50G
extent management local
segment space management auto;
永久表的索引是最初創建於表空間BIGTABLESPACE
-- 20G bigfile datafile size
create bigfile tablespace "BIGINDXSPACE"
datafile '$oracle\_home/oradata/$oracle\_sid/btsindx01.dbf' size 20G
extent management local
segment space management auto;
- 用全局臨時表替換這些永久表是否可行?
- TEMP表空間將遇到擴展TEMP表空間的問題。有沒有辦法在表空間
BIGTABLESPACE
和BIGINDXSPACE
中創建全局臨時表及其索引? - 如果不是,我如何才能使
TEMP
表空間像大文件表空間那樣工作並實現索引/表分隔? - 我可以創建兩個
TEMP
bigfile表空間並將索引創建爲一個表並將表創建爲另一個表?
我想使用全局臨時表,但我在過程中處理的數據量似乎高於並超出了全局臨時表的設計。 有什麼建議嗎?
這就是爲什麼臨時表是必要的: 我正在使用的Oracle數據庫有一個指定用戶,擁有所有權限,所有權限。客戶端預留SQL應用程序 用於以此用戶身份登錄並開始會話,在此期間可調用任何存儲過程。這些存儲過程使用永久表。我不希望一個會話的過程運行與另一個會話重疊,並且重疊 - 雙向插入數據到存儲過程中使用的永久表中。 – 2009-12-09 17:35:05
但爲什麼存儲過程首先將任何瞬態數據寫入表?特別是10個GB的瞬態數據。這是最令人困惑的設計的組成部分。如果數據沒有被永久寫入,那麼大概你可以只寫一個查詢來對照底層表來獲取你程序需要的任何數據。 – 2009-12-09 19:16:01
由於複雜性,瞬態數據被寫入表中。 從多個永久源表中收集數據,然後進行處理(連接,過濾,計算),最終結果爲 附加到多個結果表(永久性)。 加入我的意思是外部,內部或笛卡爾需要。 通過過濾我的意思是WHERE子句條件。 通過計算我的意思是選擇計算/函數調用。 這是一個複雜的多步驟過程,最好在聲明式SQL中處理。 SQL適用於簡單。另外還有 剩下的數據用於調試。 – 2009-12-09 20:22:45