Oracle内存中的块过滤情况?

客家族_Shark曾_小凡仙
博客专家认证
2012-05-23 04:29:26
比如说有两个表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操作!

不知道我这里理解的对不对?
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
其实问题 就两点

1 过滤 是把块过滤掉,还是把行过滤出来. 最后留下来的是块还是行结果集
2 如果是行结果集 要进行下一步操作,行结果集暂时存放在哪里? db_buffer里的临时表空间?
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
如果数据量很大的时候 A表过滤后有1万个块,包含需要1千条记录.B表过滤后有10万个块,包含3千条记录.
那么这11万个块,很可能无法在SGA的DATABUFFER里放得下,就得放在临时表空间里,放到硬盘上.然后加上JOIN操作 块数. 速度就慢了下来.

--Oracle 不是这么管理的,buffer cache 有自己的list 来管理cache中的数据,具体的原理还是有点长,楼主可……
[/Quote]

看了 还是不明白啊
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
如果数据量很大的时候 A表过滤后有1万个块,包含需要1千条记录.B表过滤后有10万个块,包含3千条记录.
那么这11万个块,很可能无法在SGA的DATABUFFER里放得下,就得放在临时表空间里,放到硬盘上.然后加上JOIN操作 块数. 速度就慢了下来.

--Oracle 不是这么管理的,buffer cache 有自己的list 来管理cache中的数据,具体的原理还是有点长,楼主可……
[/Quote]

兄长 主要是听同事说 ORACLE 是块操作! 目前都是搞大数据量报表开发.
上面问题关键是 过滤这步
过滤操作 只是过滤不需要的块, 当需要的块里面的不需要的记录 无法过滤掉.
只有通过后面的JOIN步骤 过滤掉不需要的记录
Dave 2012-06-28
  • 打赏
  • 举报
回复


如果数据量很大的时候 A表过滤后有1万个块,包含需要1千条记录.B表过滤后有10万个块,包含3千条记录.
那么这11万个块,很可能无法在SGA的DATABUFFER里放得下,就得放在临时表空间里,放到硬盘上.然后加上JOIN操作 块数. 速度就慢了下来.

--Oracle 不是这么管理的,buffer cache 有自己的list 来管理cache中的数据,具体的原理还是有点长,楼主可以花点时间,仔细的读一下下面的链接,应该可以理解这个过程了。

Oracle Buffer Cache 原理
http://blog.csdn.net/tianlesoftware/article/details/6573438

  • 打赏
  • 举报
回复
help me please!
飃颻 2012-06-28
  • 打赏
  • 举报
回复
Sql邏輯表達式和物理內存塊沒必要放在一起研究吧?
Wentasy 2012-06-28
  • 打赏
  • 举报
回复
支持2楼。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧