2011-11-27 80 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可能会比这大得多。) –