请教各位:oracle数据读取处理的详细过程

[复制链接]
查看11 | 回复8 | 2013-2-25 14:51:24 | 显示全部楼层 |阅读模式
我只了解
物理读:磁盘---->数据缓冲区--->客户端
逻辑读:数据缓冲区--->客户端
但是想了解更详细点。
比如
1.如果我要读取很大的数据做处理,结果集返回行很小,那么数据库会在什么地方处理这些数据。然后把结果集返回给客户端? PGA?
2.假如读取的数据量很大,内存区域放不下。数据库怎么处理。

PS:
今天写存储过程,一同事说,要用中间表存储中间结果,SQL太长不好维护。但其实我也就是嵌套了一层。
还说读取大数据量会把什么池撑爆,删除数据要立即提交,不然UNDO段会挤爆。
我刚工作,资历浅,不知道怎么反驳。
我觉得吧。
1.使用中间表存储中间结果,读写太频繁必然耗用更多系统资源。
2.如果使用中间表存储临时结果,那么我还要再次读取。缓冲区缓存必然是缓存不了那么多数据,所以我又要再次物理读。
3.中间表(非临时表),在数据插入时,必然生成事务,而在使用完之后你又要把它删除。做了多余的事情。

或者请大家推荐些介绍ORACLE内存结构及原理机制方面书籍资料,谢谢了。

回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
为什么封我?我好像没有违规吧。给个解释,谢谢。
还有,有了解的可以告诉我么。
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
sga有的就不用从磁盘读
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
〇〇 发表于 2013-1-21 20:43
sga有的就不用从磁盘读

我需要处理1000行数据,我是把它读到buffer cache里再处理还是怎么?
比如,我要求连续登陆的用户,必然是要读取最近些天的数据。但是他返回的只有少数行(用户)。这中间,我是依照谓语条件把满足条件的读取到buffer cache里吗?
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
1000行数据如果在n个块里,sga能放下n个块,就把它们全读到buffer
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
no_matter 发表于 2013-1-21 21:10
我需要处理1000行数据,我是把它读到buffer cache里再处理还是怎么?
比如,我要求连续登陆的用户,必然 ...

是的
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
1.如果我要读取很大的数据做处理,结果集返回行很小,那么数据库会在什么地方处理这些数据。然后把结果集返回给客户端? PGA?
正确

2.假如读取的数据量很大,内存区域放不下。数据库怎么处理。
会根据某种算法把一些不常用的换出去

PS:
今天写存储过程,一同事说,要用中间表存储中间结果,SQL太长不好维护。但其实我也就是嵌套了一层。
SQL分层写,加详细注释,就不难维护。
一般不用临时表,除非你这个临时结果会被后续的多个不同SQL引用。

还说读取大数据量会把什么池撑爆,删除数据要立即提交,不然UNDO段会挤爆。
UNDO自动管理,不用你操心,你立即提交也不见得用得少,因为高版本的ORACLE是根据保留时间的设置来使用UNDO的。
我刚工作,资历浅,不知道怎么反驳。
我觉得吧。
1.使用中间表存储中间结果,读写太频繁必然耗用更多系统资源。
正确

2.如果使用中间表存储临时结果,那么我还要再次读取。缓冲区缓存必然是缓存不了那么多数据,所以我又要再次物理读。
确实可能发生物理读

3.中间表(非临时表),在数据插入时,必然生成事务,而在使用完之后你又要把它删除。做了多余的事情。
如果用临时表,比中间表的REDO要少。即使SQL中不用临时表,有时候ORACLE也会替你生成一张临时表, 要看计划。

回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
newkid 发表于 2013-1-22 00:44
1.如果我要读取很大的数据做处理,结果集返回行很小,那么数据库会在什么地方处理这些数据。然后把结果集返 ...

select userid
from
(select userid,

sysdate - to_date(statis_date,'yyyyMMdd')+ 1 interval_day,

dense_rank()over(partition by userid order by statis_date desc) compare_val
from t_userlog
where statis_date >= '20130101'

and statis_date = '20130101'

and statis_date <= '20130121'

)t
where t.interval_day = compare_val
如上的查询,内联视图是不是会生成一个临时表然后把数据放到临时表空间里?
外部查询再读取系统生成的临时表。

回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
absent_young 发表于 2013-1-22 10:04
select userid
from
(select userid,

在执行计划中可以看出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行