Oracle如何执行读操作?

时间:2011-11-27 13:43:04

标签: sql oracle select

假设我们有一个表格,其中包含有关人的信息。像NAME或SURNAME这样的列很小(我的意思是它们的大小不是很大),但是包含照片或者某个人的视频(blob列)的列可能非常大。所以当我们执行选择操作时:

select * from person

它将检索所有这些信息。但在大多数情况下,我们只需要检索人的姓名或姓氏,因此我们执行此查询:

select name, surname from person

问题:Oracle会读取整个记录(包括blob列),然后只是过滤掉名称和姓氏列,还是只读取名称和姓氏列?

此外,即使我们为这样大的数据(人的照片和视频)创建了一个单独的表,并且在该人的表中拥有该表的外键并且只想检索照片,所以我们执行此查询:

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

Oracle会在largePesonData中读取人员表和整个记录中的整个记录​​,还是只读取largePesonData中带有照片的列?

1 个答案:

答案 0 :(得分:6)

Oracle以块的形式读取数据。 假设您的块大小为8192字节,平均行大小为100字节 - 这意味着每个块将填充8192/100 = 81行(由于块头中有一些开销,因此不准确 - 但我是试图保持简单)。

所以当你     从人中选择姓名,姓氏; 实际上,您至少在块上检索了所有数据(81行),稍后在筛选后只返回您请求的数据。

两个例外是:

  1. BLOB列 - “选择名称,来自人的名字”将不会检索BLOB内容本身,因为BLOB列包含对实际BLOB的引用(它位于表空间的其他位置,甚至位于TS中)
  2. 索引列 - 如果您使用列名称和姓氏在表上创建索引,则Oracle可能只扫描此特定索引并仅检索这两列。