Oracle内存中的块过滤情况?
比如说有两个表A和B 分别有100个块和200个块.
现在从A表提取符合条件的数据,跟B表符合条件的数据JOIN
select c.name,c.student_id,course_name,score
from
(
select student_id,name
from a
where a.name like '张%'
) c
inner join
(
select b.score,student_id,course_id,course_name
from b
where insert_time >to_date('2012-03-08','YYYY-MM-DD')
) d
on c.student_id=d.student_id
A 表符合记录的有10条,并且分布在10个块中.B表符合记录的有30条,分布在20块里. A,B两表无索引
那么把A表100块和B表200个块扫描到内存SGA里的DATA BUFFER里.
接着过滤 A表留下了10个块,B表留下20个块在SGA中.
inner JION 操作: 从10块中获取一条记录,去匹配20块中的30条记录. 那么将是10*20=200个块操作.
最后匹配10行记录,把这10行记录放到回话的PGA里
在回话的PGA中把不需要的列过滤掉,也就是提取所需要的列,发送到客户端.
如果数据量很大的时候 A表过滤后有1万个块,包含需要1千条记录.B表过滤后有10万个块,包含3千条记录.
那么这11万个块,很可能无法在SGA的DATABUFFER里放得下,就得放在临时表空间里,放到硬盘上.然后加上JOIN操作 块数. 速度就慢了下来.
在大数据量情况下 采用物理临时表方法,A表过滤后的1万个块中的1千条记录,写回硬盘,只需要100个块.每个块装10条记录. 那么B表就是300个块.
这样就产生400个块IO操作.并且400个块还可能保留在SGA中,接下来的JOIN操作不再需要读IO操作,也不需要那么多块的循环匹配操作.减少了逻辑IO操作!
不知道我这里理解的对不对?