2011-08-04 67 views
2

在Oracle 10g中,創建索引和改變表的順序是什麼?在添加列之前創建索引與添加列之後創建索引 - 是否重要?

說我有一個查詢Q與其中上表T.列C子句現在我執行下列情形之一:

  1. 我創建索引I(C),然後添加列X,Y ,Z。
  2. 添加列X,Y,Z然後創建索引I(C)。

Q被「SELECT * FROM T其中C =任何」

1和2之間會不會有在上表T Q的性能顯著差當T包含非常大量的行?

我個人使它成爲一個慣例做#2,但其他人似乎有不同的意見。

感謝

回答

4

這沒有什麼區別,如果你之前或創建索引之後添加列一個表。優化器應爲查詢選擇相同的計劃,並且執行時間應保持不變。

根據表的物理存儲參數,有可能是添加額外的列和填充他們的數據可能會迫使相當多的行遷移的發生。該行遷移將生成對錶上索引的更改。如果在使用數據填充三個新列時存在索引,則由於附加的索引維護,填充X,Y和Z中的數據可能會稍微延長一點。

1

如果您添加列不填充它們,那麼它是相當快,因爲​​它僅僅是一個元數據的變化。添加索引確實需要讀取表(或潛在的另一個索引),因此與記錄新索引詳細信息的簡單元數據更改相比,這可能非常耗時且影響更大。

如果新列將被填充作爲ALTER TABLE的一部分,這是一個不同的問題。

  1. 數據庫可以將數據表中數據的每一行
  2. 服務器內存可能沒有足夠的空間來記錄每一行該表改變
  3. 因此這些過程中發生非計劃停機行更改可能被寫入到數據文件之前提交,並因此被寫成髒塊
  4. 區塊的下一個讀,後ALTER TABLE已成功完成將做延遲塊清除(即記錄的事實變化是承諾)

如果添加的列(數據),然後再創建索引將(可能)讀取表並執行延遲塊清除的額外工作。

如果創建索引第一,然後添加列,創建索引可能會快一些,但延遲塊清除不會發生,並且看家將由應用程序之後(可能由select * from T where C = whatever

有所回升