2012-01-03 38 views
3

我需要備份表及其數據作爲軟件測試的一部分。確切的表格和它們包含的數據可能會有所不同,所以我無法對DDL或數據進行硬編碼。備份表的名稱與原始表類似,但帶有前綴「QA_」。類似但不相同(除了前綴),僅僅是因爲爲了解決表名的31個字符限制,我必須縮寫一些名稱。哪個更有效率的Oracle SQL? PARALLEL CREATE TABLE AS SELECT或PARALLEL INSERT?

這樣做會更快嗎?使用遊標對象,並通過表循環,從而得到他們的DDL這樣的:

select dbms_metadata.get_ddl(''TABLE'',' || '''' || cursor_rec.object_name || '''' || ') from dual 

使用DDL創建備份表,然後填充這些表有:

INSERT /*+ parallel(' || new_table_name || 'DEFAULT) */ INTO ' || new_table_name || ' SELECT * FROM ' || table_name || '' 

或做一個簡單的:

CREATE TABLE' || new_table_name 'PARALLEL AS SELECT * from ' || table_name || '' 

這兩種方法中哪一種更快?

+2

由於我們沒有您的數據庫,也沒有您的硬件,所以我們無法分辨。你爲什麼不簡單地在**你的**數據庫上運行這兩個版本,並分辨時間? – 2012-01-03 22:05:26

+0

我在理論上講的是哪種方法會更快,因爲我不能在尚不存在的數據和表上運行這些方法。 在衡量使用哪種方法時,我可以預先考慮哪些因素? – 2012-01-03 22:11:54

+0

你總是可以創建一些虛擬表來測試它。使用SQL * Plus'autotrace'功能將告訴你哪個解決方案做了更多的工作。 – 2012-01-03 22:19:22

回答

4

那麼,INSERT /*+ PARALLEL */CREATE TABLE .... PARALLEL AS SELECT ...都會做直接加載插入。所以,他們很大程度上將使用相同的代碼路徑來加載數據。

在繼續加載之前,CTAS需要首先執行DDL來創建表。但是,這是少量的固定工作。表被複制的越大,將會是更小的因子。

最後,我會提一下,你應該看看NOLOGGING以進一步提高性能。

在CTAS上,您可以在PARALLEL關鍵字後面添加NOLOGGING關鍵字。對於INSERT /*+ PARALLEL */,您需要先執行ALTER TABLE ... NOLOGGING以啓用它。

請注意,如果您決定使用NOLOGGING,則需要知道幾件事情。首先,只有直接加載會做nologging。對於表格,這意味着CTAS和插入PARALLEL或APPEND提示。

其次,考慮NOLOGGING的恢復影響。當使用NOLOGGING選項加載表時,數據是而不是已記錄到REDO。因此,除非您在之後使用備份併成功完成數據備份,否則無法恢復表中的數據。

希望有所幫助。

+0

您將無法使用備用數據庫恢復數據。 – Ben 2012-01-03 22:35:32

+0

謝謝,我欣賞提示。 – 2012-01-03 22:47:18

0

Create-table-as通常會更快,因爲它不包含許多選項,例如「主鍵,唯一鍵,外鍵,檢查約束,分區標準,索引和列默認值」。

DBMS_METADATA默認會包含大部分這些對象,這會顯着增加複製數據所需的時間。 (儘管您可能希望這些對象存在以供選擇,驗證等)