问问更健康~

wh62592855 2009-09-26 05:50:10
1
今天在学习的过程中碰到了MEMORY SORT和DISK SORT,虽然不是特别理解到底是怎么回事,可望文生义一下,猜测前者就是在内存中完成排序,后者就是在磁盘中排序。不过紧接着就产生了一个疑问,在磁盘中会排序吗?
接下去书上说当一个排序很大无法一次性在内存中完成的时候,比如说这个排序需要50M,而内存只有30M,那么ORACLE会把这个排序分为两个子排序PART1(25M)和PART2(25M),PART1先在内存中完成排序,PART2放置到临时表空间中,等PART1排好了就把PART1放去临时表空间,把PART2取回内存进行排序,可是我在想,这个排序怎么完成呢?内存永远只有50M,即便PART1和PART2都分别完成了排序,可是你总得要把这两个部分合起来再排一次吧,可是一合起来就50M超过内存的大小30M了,所以我想问当PART1和PART2分别完成了排序后,接下来ORACLE怎么办呢?

====================================================================================================
2
直接关机时发生CHECKPOINT吗?
话说在数据库关闭的时候会发生CHECKPOINT,以保证脏数据都写到数据文件中。可有的时候我在SQL*PLUS里完成操作后并不会使用SHUTDOWN关闭,而是直接exit推出,完了就直接关电脑了。这个时候会发生CHECKPOINT吗?(应该会的哦,因为我每次重新开机并没提示我有什么错)

====================================================================================================
3
ORACLE中为什么只有一个LGWR进程?而不像DBWRn和ARCn一样都可以设置多个。
难道因为ORACLE觉得没必要设置多个LGWR吗
有的时候当有大量更新确实会使LGWR忙不过来,比如说LOG BUFFER中内容增长的速度已经大于LGWR往日志里写的速度

====================================================================================================
4
select * from v$sgastat
show parameter log_buffer
这两条语句得到的LOG_buffer大小为什么会有些不同?
SQL> select * from v$sgastat where name like '%log%';

POOL NAME BYTES
------------ -------------------------- ----------
log_buffer 2945024
shared pool MS alert log 72704
shared pool log_simultaneous_copies 256
shared pool max allowable # log files 253200
shared pool log file size history arr 168
shared pool log_checkpoint_timeout 12360

6 rows selected.

SQL> show parameter log_buffer

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_log_buffers_corrupt boolean FALSE
_log_buffers_debug boolean FALSE
log_buffer integer 2899456
SQL>

...全文
332 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 inthirties 的回复:]
刚才做了一下实验,如果是异常退出是 rollback的,

如果是正常退出是commit的。

也纠正我自己的一个错误认识了。
[/Quote]

我刚才又去试了下
用EXIT正常退出的话是COMMIT了
如果直接点右上角的叉叉关闭掉SQL*PLUS就ROLLBACK了
fuyou001 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 wh62592855 的回复:]
引用 30 楼 inthirties 的回复:
你的标题很囧哟

仿佛看到了付笛声和任静那小两口相互关爱和信任的眼神。
SQL codeSQL> showuserUSERis "SCOTT"
SQL>select*from dept;

DEPTNO DNAME LOC---------- -------------- -------------10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO40 OPERATIONS BOSTON

SQL> show autocommit;
autocommitOFF
SQL> show parameter auto
ORA-00942:tableorview doesnot exist


SQL>insertinto deptvalues(55,'a','a')2 ;1 row created.

SQL>select*from dept;

DEPTNO DNAME LOC---------- -------------- -------------55 a a10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO40 OPERATIONS BOSTON

SQL>exit
Disconnectedfrom OracleDatabase 10g Enterprise Edition Release10.2.0.1.
oductionWith the Partitioning, OLAPand Data Mining options

C:\Documentsand Settings\Admin>sqlplus scott/tiger

SQL*Plus: Release10.2.0.1.0- Productionon Mon Sep2810:23:422009

Copyright (c)1982,2005, Oracle.All rights reserved.


Connectedto:
OracleDatabase 10g Enterprise Edition Release10.2.0.1.0- ProductionWith the Partitioning, OLAPand Data Mining options

SQL>select*from dept;

DEPTNO DNAME LOC---------- -------------- -------------55 a a10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO40 OPERATIONS BOSTON

SQL>
好像不对啊老大
[/Quote]
这种情况,你直接退出,当会自动提交,当提交没成功时,会自动回滚!上面的是更新语句,没有发生异常,所以就提交!
inthirties 2009-09-28
  • 打赏
  • 举报
回复
刚才做了一下实验,如果是异常退出是 rollback的,

如果是正常退出是commit的。

也纠正我自己的一个错误认识了。
inthirties 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 wh62592855 的回复:]
我刚去查了下
有人说是这样的
客户端断开连接的话是自动提交的
如果操作的过程中服务器死机的话是回滚 客户机死机是提交
[/Quote]

如果是纯sqlplus的环境的话,推出session是不会commit的,这是肯定的。

有一些客户端只所以会commit是,客户端本身的配置上的设置,plsql dev和青蛙都有这样的设置。
比如plsql dev可以找到这个设置 preference->oracle->connection->logoff with open transaction


不清楚你上面的实验是如何做的。如果在事务后面出现了ddl语句或者是dcl语句,都会直接提交事务,破坏事务的完整性的,不知道是不是这个导致的。

你多试试。
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
我刚去查了下
有人说是这样的
客户端断开连接的话是自动提交的
如果操作的过程中服务器死机的话是回滚 客户机死机是提交
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
exit再登陆进去那条insert的记录还在呀 没有rollback
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 inthirties 的回复:]
你的标题很囧哟

仿佛看到了付笛声和任静那小两口相互关爱和信任的眼神。
[/Quote]
SQL> show user
USER is "SCOTT"
SQL> select * from dept;

DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> show autocommit;
autocommit OFF
SQL> show parameter auto
ORA-00942: table or view does not exist


SQL> insert into dept values(55,'a','a')
2 ;

1 row created.

SQL> select * from dept;

DEPTNO DNAME LOC
---------- -------------- -------------
55 a a
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.
oduction
With the Partitioning, OLAP and Data Mining options

C:\Documents and Settings\Admin>sqlplus scott/tiger

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Sep 28 10:23:42 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select * from dept;

DEPTNO DNAME LOC
---------- -------------- -------------
55 a a
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL>

好像不对啊老大
smallbear923 2009-09-28
  • 打赏
  • 举报
回复
make .......
inthirties 2009-09-28
  • 打赏
  • 举报
回复
你的标题很囧哟

仿佛看到了付笛声和任静那小两口相互关爱和信任的眼神。
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
OK
谢谢二位的回答
我明白了

帖子再放放让其他人看看 晚些结贴
inthirties 2009-09-28
  • 打赏
  • 举报
回复
sqlplus exit后,如果没有执行过
set autocommit on;

事务均自动rollback。

开始关闭计算机,OS是会关闭服务,关闭服务,这个当然会触发checkpoint

傻儿哥 2009-09-28
  • 打赏
  • 举报
回复
什么时候发生checkpoint?
我们知道了checkpoint会刷新脏数据,但什么时候会发生checkpoint呢?以下几种情况会触发checkpoint。
1.当发生日志组切换的时候
2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候
3.当运行ALTER SYSTEM SWITCH LOGFILE的时候
4.当运行ALTER SYSTEM CHECKPOINT的时候
5.当运行alter tablespace XXX begin backup,end backup的时候
6.当运行alter tablespace ,datafile offline的时候;

三:增量检查点(incremental checkpoint)
oracle8以后推出了incremental checkpoint的机制,在以前的版本里每次checkpoint时都会做一个full thread checkpoint,这样的话所有脏数据会被写到磁盘,巨大的i/o对系统性能带来很大影响。为了解决这个问题,oracle引入了checkpoint queue机制,每一个脏块会被移到检查点队列里面去,按照low rdb(第一次对此块修改对应的redo block address)来排列,靠近检查点队列尾端的数据块的low rba值是最小的,而且如果这些赃块被再次修改后它在检查点队列里的顺序也不会改变,这样就保证了越早修改的块越早写入磁盘。每隔3秒钟ckpt会去更新控制文件和数据文件,记录checkpoint执行的情况。

增量检查点并不去更新数据文件头,只是在控制文件中记录了checkpoint progress record这个区域,记下low rba,on-disk rba等信息。这些信息就可以用来快速恢复。
wh62592855 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 inthirties 的回复:]
引用 21 楼 wh62592855 的回复:
哈哈 谢谢老大夸奖
顺便问一下
有没有什么地方可以查看CHECKPOINT发生的记录信息呢?
有的话查一下就知道直接关电脑的时候有没有发生CHECKPOINT了嘛


记录checkpoint的地方有很多,

比如v$database, v$datafile; v$log_his .... 不过这里不同的地方的scn都一样是同样的意义,不过是作用于不同的对象而已。

你直接关闭电脑,是正常关机还是断电叻。

shutdown abort类似断电,这时候,这时候,中间数据是不会回滚也不会提交的,所有的事务是中间状态,只有等我们的数据库在重启(如果还没有损害的话,主要是redo和归档已经controlfile)以后redo后undo叻。
[/Quote]
我指的是正常关机
就是在SQL*PLUS中EXIT后
开始-关闭计算机
inthirties 2009-09-28
  • 打赏
  • 举报
回复
问题一

这个是一个Oracle的技术细节上的问题,上面有兴趣的人对Oracle这块的一个猜测,当然这个猜测不是毫无根据的,所以还是值得参考。


问题二
当然。不仅是正常关机,只要是有触发一个全局的检查点,都会发生checkpoint。

问题三
Lgwr的写频率是比较好的,我记得好像是3秒钟触发一次,或者是redo buffer的内容达到1/3或者redo buffer数据达到1M 都会触发,所以这个lgwr触发是很频繁的,这个具体可以参考一下网上的资料,所以log buffer不会很大,推荐是3M而已。这里技术上完全是可以多线程来做的,但是可能Oracle并不觉得这里有很大的价值,而且也不需要为之增加复杂度,有时候简单是美。

问题四
ls的有一个兄弟已经回答的很完整了。

鼓励学习讨论贴。 管理这方面的需要多讨论,多谈自己的想法。
inthirties 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wh62592855 的回复:]
哈哈 谢谢老大夸奖
顺便问一下
有没有什么地方可以查看CHECKPOINT发生的记录信息呢?
有的话查一下就知道直接关电脑的时候有没有发生CHECKPOINT了嘛
[/Quote]

记录checkpoint的地方有很多,

比如v$database, v$datafile; v$log_his .... 不过这里不同的地方的scn都一样是同样的意义,不过是作用于不同的对象而已。

你直接关闭电脑,是正常关机还是断电叻。

shutdown abort类似断电,这时候,这时候,中间数据是不会回滚也不会提交的,所有的事务是中间状态,只有等我们的数据库在重启(如果还没有损害的话,主要是redo和归档已经controlfile)以后redo后undo叻。
傻儿哥 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wh62592855 的回复:]
哈哈 谢谢老大夸奖
顺便问一下
有没有什么地方可以查看CHECKPOINT发生的记录信息呢?
有的话查一下就知道直接关电脑的时候有没有发生CHECKPOINT了嘛
[/Quote]

Mon Sep 28 08:10:21 2009
Completed checkpoint up to RBA [0xa7d.2.10], SCN: 9455233800127
Mon Sep 28 08:20:19 2009
Incremental checkpoint up to RBA [0xa7d.144.0], current log tail at RBA [0xa7d.19b.0]
~
~
wh62592855 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 oraclemch 的回复:]
引用 10 楼 fuyou001 的回复:
2:用exit 退出spl/plus ,你的sql 会提交,如果有异常的话,就会roolback
直接关机,是不会checkpoint 的!
  你电脑重启开机后,oracle 就会自己redo/undo

3:ARCn有多个解发条件:每三秒会自己归档
                        当到达 logBuffer的三分之一
                        commit 时

    还有Arcn是顺序写,速度比较 快


先redo还是先undo?
[/Quote]
这个问题我来回答你吧
先REDO(重做已提交的何未提交的) 再UNDO(回滚未提交的)
wh62592855 2009-09-27
  • 打赏
  • 举报
回复
TO :fuyou001 和 zhangchu_63

谢谢你们的回答
可是我昨晚试了一下 直接退出SQL*PLUS 并没有使用SHUTDOWN关闭数据库
在我重启计算机后查看ALERT.LOG里是多了一条SHUTDOWN记录的
我认为是在重新启动计算机的过程中操作系统会自动关闭打开的ORACLE服务 例如OracleServiceORCL
这个时候可能就发生了SHUTDOWN操作
wh62592855 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 csucxcc 的回复:]
对于第一个问题其实很多涉及了一个合并排序算法: 
<1> 基本思想

    合并排序的算法就是二分法。
  分解:将n个元素分解成各含 一半元素的子序列。
  解决:用合并排序法对两个子序列递归地排序。
  合并:合并两个已排序的子序列排序结果。
  在对子序列排列时,当其长度为1时递归结束,因为单个元素被认为是已排好序的.合并排序的.合并排序的关键步骤在于合并目前产生的两个已排好序的子序列:
A[p..q] 和 A[q+1…r];
  将它们合并成一个已排好序的子序列A[p..r]. 我们引入一个辅助过程merge(A,p,q,r)来完成这一项合并工作,其中A是数组,p,q,r是下标

[/Quote]
恩 我去回顾一下MERGE SORT算法
wh62592855 2009-09-27
  • 打赏
  • 举报
回复
谢谢另外两个问题的回答

等待第一个问题的回答
加载更多回复(17)

17,377

社区成员

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

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