Oracle如何执行读操作?

mak*_*aks 4 sql oracle select

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

select * from person
Run Code Online (Sandbox Code Playgroud)

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

select name, surname from person
Run Code Online (Sandbox Code Playgroud)

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

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

select photo 
from person p 
join largePesonData d on p.largeDataID = d.largeDataID 
where p.id = 1 
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*viv 6

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

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

两个例外是:

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