Suppose we have a table which holds information about person. Columns like NAME or SURNAME are small (I mean their size isn’t very large), but columns that hold a photo or maybe a person’s video (blob columns) may be very large. So when we perform a select operation:
select * from person
it will retrieve all this information. But in most cases we need only retrieve name or surname of person, so we perform this query:
select name, surname from person
Question: will Oracle read the whole record (including the blob columns) and then simply filter out name and surname columns, or will it only read name and surname columns?
Also, even if we create a separate table for such large data(person’s photo and video) and have a foreign key to that table in person’s table and want to retrieve only photo, so we perform this query:
select photo
from person p
join largePesonData d on p.largeDataID = d.largeDataID
where p.id = 1
Will Oracle read a whole record in person table and whole record in largePesonData or will it simply read the column with photo in largePesonData?
Oracle reads the data in blocks.
Let’s assume that your block size is 8192 bytes and your average row size is 100 bytes – that would mean each block would populate 8192/100 = 81 rows (It’s not accurate since there is some overhead coming from the block header – but I’m trying to keep things simple).
So when you
select name, surname from person;
You actually retrieve at least on block with all of it’s data (81 rows), and later after it is being screened returning you only the data you requested.
Two exceptions to this are: