This Oracle documentation page提到在Oracle中,爲什麼最後創建LONG類型的列?
...類型的列LONG被創建的最後
但沒有說爲什麼。
什麼原因可以將它們存儲在行尾?
This Oracle documentation page提到在Oracle中,爲什麼最後創建LONG類型的列?
...類型的列LONG被創建的最後
但沒有說爲什麼。
什麼原因可以將它們存儲在行尾?
Oracle中的LONG
與C或C++中的long
完全不同。在Oracle中,LONG
是有點像VARCHAR2
但有一個更大的最大長度(2GB,我相信?)
它的最後一個存儲是因爲如果你有一個表,是(INT a, LONG foo, INT b)
並將其存儲在順序的原因,那麼爲了獲取b
列的值,它必須在中讀取LONG
列所佔用的所有數據頁面。通過將其存儲在最後,如果不需要,它不必讀取所有數據。
(不是專家在甲骨文 - 只是不得不尋找一個LONG是什麼)
在一般情況下,多頭(和其他BLOB類型)都不會受到搜索條件(連接或WHERE子句)。因此,將它們轉移到最後是有意義的,這樣其他列(它們更可能被一起查詢)緊密地位於一起。然後,只有這些其他列需要閱讀,同時評估此特定行是否與查詢條件匹配。
值得指出的是,這只是INTERNAL存儲。
從開發者的角度來看,LONG可以是第三,第六或第一列,或者任何地方。而且您仍然可以將列添加到具有LONG的表格中。也就是說,你幾乎肯定不應該再創建一個帶有LONG的表格。他們應該是CLOB(或BLOB而不是LONG RAW)。
create table test_long (id number, val long, create_date date);
desc test_long
Name Null? Type
------------------------------ -------- --------------
1 ID NUMBER
2 VAL LONG
3 CREATE_DATE DATE
我的猜測(除非有人誰甲骨文工作說起來,這是猜測)是,這是因爲渴望是/是最有可能在一個塊的行「不適合」。一排有LONG的人很可能需要超過1個街區。 LONG最有可能分裂(因爲它的大小)。通過將其推到最後,所有其他列更可能坐在一個塊上。
爲什麼這有'算法'標籤? – MAK 2010-08-11 10:59:32
@MAK:嗯,在**中存儲什麼命令是一個問題,然後有一個解決方案指定了一種解決問題的方法,它具有自己的優點和缺點。不算'算法' - 值得嗎? – Moeb 2010-08-11 11:35:49