假设我们有一个表格,其中包含有关人的信息。像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中带有照片的列?
答案 0 :(得分:6)
Oracle以块的形式读取数据。 假设您的块大小为8192字节,平均行大小为100字节 - 这意味着每个块将填充8192/100 = 81行(由于块头中有一些开销,因此不准确 - 但我是试图保持简单)。
所以当你 从人中选择姓名,姓氏; 实际上,您至少在块上检索了所有数据(81行),稍后在筛选后只返回您请求的数据。
两个例外是: