2011-11-27 82 views
4

假設我們有一張關於人的信息的表格。像NAME或SURNAME這樣的列很小(我的意思是它們的大小不是很大),但是包含照片或者某人視頻(blob列)的列可能非常大。所以當我們執行選擇操作時:Oracle如何執行讀取操作?

select * from person 

它將檢索所有這些信息。但在大多數情況下,我們只需要檢索名稱或個人姓,所以我們執行這個查詢:

select name, surname from person 

問題:將甲骨文讀取整個記錄(包括BLOB列),然後簡單地過濾掉名稱和姓氏列,還是隻能讀名字和列名?

而且,即使我們創造瞭如此大的數據(人的照片和視頻),一個單獨的表,並在人的表的外鍵到表,並希望只檢索照片,所以我們執行這個查詢:

select photo 
from person p 
join largePesonData d on p.largeDataID = d.largeDataID 
where p.id = 1 

Oracle會讀取largePesonData中的人員表和整個記錄中的整個記錄​​,還是隻讀取largePesonData中的照片列?

回答

6

Oracle以塊的形式讀取數據。 讓我們假設你的塊大小是8192字節,你的平均行大小是100字節 - 這將意味着每個塊將填充8192/100 = 81行(這是不準確的,因爲有一些開銷來自塊頭 - 但我'試圖讓事情變得簡單)。

所以當你 選擇名字,姓氏從人; 實際上,您至少在塊中檢索所有數據(81行),稍後在篩選後只返回您請求的數據。

兩個例外是:

  1. BLOB列 - 「選擇名稱,從人surename」不會檢索BLOB內容本身,因爲BLOB列包含實際的BLOB的引用(它位於其他地方的表空間或甚至在另一個TS中)
  2. 索引列 - 如果您使用列名和姓在表上創建索引,Oracle可能只會掃描此特定索引並僅檢索這兩列。
+1

小於約4000字節的LOB可以與行一起內聯存儲。 (雖然圖片和視頻LOB可能會比這大得多。) –