2012-03-13 100 views
1

我需要創建一個表,其中包含另一個字段的一些字段,但我不想用另一個字段的值填充它。 IE:從另一個表中創建一個表而不填充它

假設我們有一個擁有數百萬條記錄的表A,並且我想創建一個包含3列表A(具有相同類型)的表B(這不是視圖,它將成爲一個表) 。

我已經做了以下方式:

CREATE TABLE B AS (
      SELECT column1,column2,column3 from A where 1=0; 
     ); 

但我真的很擔心執行有關性能只怕有關方法將獲取的每一行(記住表中有這麼多行)並檢查荒謬的情況。

所以我的問題是:

  • 正在檢查的條件,每行或SQL優化 會自動放棄嗎?

  • 有沒有更好的方法來做到這一點?

在此先感謝。

回答

4

優化程序將在編譯時評估條件,並且不會從表中提取所有數據只是爲了檢查不依賴於正在提取的數據的謂詞。

但是,通常情況下,只需使用適當的數據類型生成CREATE TABLE語句,而不是基於SELECT語句創建表。你不能在你使用CREATE TABLE AS SELECT聲明創建的表上定義約束,這是你真正想要的,如果這真的是一個永久性表。

如果您確實想要,可以使用DBMS_METADATA.GET_DDL過程爲表獲取DDL,然後手動修改該DDL以提取您想要保留的內容。

1

你的方法沒有問題。 Oracle將首先創建一個空表,然後嘗試填充它。由於where條件返回false,因此不會提取數據,因此不存在性能問題; 我在10米大的桌子上嘗試過,沒有性能問題。

Michel。