Oracle對行數據的存儲結構ROW HEADER(行頭)和COLUMN DATA(列數據)。ROW HEADER存儲的信息是一個FLAG BYTE,一個LOCK BYTE 和COLUMN,COUNT.COLUMN DATA包含COLUMN LENGTH和COLUMN DATA。
關于這些我們可以DUMP個表做一下測試:
|
得出來的文件在UDUMP中。
我們查看如下信息:
|
列的值,Oracle首先做的是檢查這些相關列的長度位.這個操作比較快而且效率較高。但是如果反復頻繁的這樣子做還是會帶來性能方面的影響。
下面的例子中創建了一個有10列的表并插入數據。
先設置DB_BLOCK_SIZE=2K(用參數設置,在這里設置為這個只是為了測試方便):
|
從上面的例子很明顯可以看到在一個表中做查詢時,查詢的數據和列的屬性都是一樣的,但是所查的列位于第一列時查詢速度比在第10快了差不多10%。所以在建表的時候規則就是根據應用將表中經常訪問的列放面前面。建表時一般都有一個PRIMARY KEY的列,像這種屬性的列一般我們直接訪問的并不多。所以我們一般不放在第一列.關于這個其實如果我們有注意到的話,Oracle本身字典內表也是這樣子,desc dba_objects看看或者其他的表可以試試。還有另外一個要考慮的列的位置的就是列中含有較多的NULL值時所要放的位置。
Oracle存儲NULL值時,一行中某個列存在NULL值,而這一列的后面的列中存在有數據(非NULL),則Oracle會分配1byte來存放NULL。如果這一列的后面沒有列或者都是NULL值時。這一列和后面的NULL值Oracle都不做存儲.列信息也不存儲。這一點可以看以下例子:
|
然后查看DUMP出來的文件的相關信息:
|
結論:
創建一個表時,可以將我們經常訪問到的列放在表的前面。一般很少直接SELECT出來的PRIMARY KEY列可以放到中間來。列中如果可能會含有較多NULL值的列可以放在最后面??梢越K合考慮上面兩點,根據系統的應用做相應操作。
新聞熱點
疑難解答