翻译自asktom
原文地址
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:880343948514#53164728392094
本人文档 如需转载 请注明出处
问
create table test( a int);
begin
for i in 1..10000 loop
insert into test values (i);
end loop;
end;
set autotrace on
select count(0) from test;
Execution Plan————————————————————————————— 0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF ‘TEST’Statistics————————————————————————————— 0 recursive calls
4 db block gets 20 consistent gets 0 physical reads 0 redo size 369 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processedselect * from test where a=10;
Execution Plan————————————————————————————— 0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF ‘TEST’Statistics————————————————————————————— 0 recursive calls
4 db block gets 21 consistent gets 0 physical reads 0 redo size 360 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processedselect * from test;
Execution Plan————————————————————————————— 0 SELECT STATEMENT Optimizer=CHOOSE
Statistics————————————————————————————— 0 recursive calls
4 db block gets 686 consistent gets 0 physical reads 0 redo size 185864 bytes sent via SQL*Net to client 74351 bytes received via SQL*Net from client 668 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 10001 rows processed问题
1:当查询count(0),oracle怎么作?既然我没有索引,oracle是否会查询所有的块来获得这个数字?
如果是,那么为什么consistent gets比select * from test少很多;这两个查询都是全表扫描
2:为什么select * from test比select * from test where a=10的consistents gets要高,既然这里没有索引,oracle需要查询每个块获得这个值,但是事实并不如此。
答:
Q1)select count(0) 和select count(*) from (select 0 from t)是一样的
因此,oracle需要查询每个快去发现行来给你一个0的值
Q2)你的arraysize给结果带来了一个付作用,你必须有一个8k的块大小我来重现这个结论
我们期待的是20个consistent gets?,但是,sqlplus默认的array size是15行/次返回。10000/15=666。66666。好,666+20=686,整个的consistents gets是686
这就是为什么,当你返回15行的时候,oracle在返回数据的时候暂停下来,当你需要下15个数据的时候,它在继续你的查询,下面看看不同的array size是如何导致结果不同的,从15开始
ops$tkyte@8i> select * from test;
10000 rows selected.
Statistics————————————————————————————— 0 recursive calls
4 db block gets 686 consistent gets 0 physical reads 0 redo size 108813 bytes sent via SQL*Net to client 46265 bytes received via SQL*Net from client 668 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 10000 rows processedops$tkyte@8i> set arraysize 1000
ops$tkyte@8i> select * from test;
10000 rows selected.
Statistics————————————————————————————— 0 recursive calls
4 db block gets 30 consistent gets 0 physical reads 0 redo size 86266 bytes sent via SQL*Net to client 942 bytes received via SQL*Net from client 11 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 10000 rows processedops$tkyte@8i> set arraysize 5000
ops$tkyte@8i> select * from test;
10000 rows selected.
Statistics————————————————————————————— 0 recursive calls
4 db block gets 22 consistent gets 0 physical reads 0 redo size 149793 bytes sent via SQL*Net to client 382 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 10000 rows processed令一个有趣的事情值得主意的是,当array size设置的太大的时候,传输的数据的数量上升的,有一个逐渐缩小的array size不会导致负栽超出。
问
我现在有一个更大的困惑,虽然你解释的非常好,但是我在我的环境中测试了,得到了不同的结果,我的查询是select *返回122行数据
当arrayseze为15的时候,consistents gets是1051(122/15=8),这就意味着是1043+8=1051(多么好)
因此我依据上面的例子假设,当我作conunt(*)的数据将是1043,对吗?但是,arraysize为15的时候,count(*)的consistents gets为920,我不明白这是如何得来的,
我作了另外一个测试,
Arraysize 为122 ,select * 的时候,consistents gets 为1043
Arraysize为122 ,select count(*)的时候,consistents gets为920
Arraysize 为5000,select * 的consistents gets 为1043
Arraysize为5000,select count(*)的consistents gets为920
期待你的回答.
答
Count(*)返回多少行,1行
Array size可以踢开不关,整个语句将在一次调用中被处理.
另外,count(*)可能会用到索引.
参考下面的例子
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> exec show_space( ‘T’ )
Free Blocks…..........................0
Total Blocks….........................320
Total Bytes…..........................2621440
Unused Blocks…........................4
Unused Bytes….........................32768
Last Used Ext FileId….................7
Last Used Ext BlockId…................40969
Last Used Block…......................60
PL/SQL procedure successfully completed.
因此表大概消耗了316个块
ops$tkyte@ORA817DEV.US.ORACLE.COM> select * from t;
22905 rows selected.
Statistics————————————————————————————— 0 recursive calls
12 db block gets 1823 consistent gets 46 physical reads 0 redo size 2704019 bytes sent via SQL*Net to client 169811 bytes received via SQL*Net from client 1528 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 22905 rows processed22905/15=1527+316=1843,这个值在我们的consistents gets附近(也是我们期待的)
ops$tkyte@ORA817DEV.US.ORACLE.COM> select count(*) from t;
Statistics————————————————————————————— 0 recursive calls
12 db block gets 319 consistent gets 46 physical reads 0 redo size 369 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed这里,count(*),既然他只是在一次调用中完成,不需要arraysize,仅仅作一次consistents以及每一个block一次,因此,他将是319个consistents gets(这个取决于表的大小)
现在为表增加一个主键
ops$tkyte@ORA817DEV.US.ORACLE.COM> alter table t add constraint t_pk primary
key(object_id);
Table altered.
ops$tkyte@ORA817DEV.US.ORACLE.COM> analyze table t compute statistics;
Table analyzed.
ops$tkyte@ORA817DEV.US.ORACLE.COM> select count(*) from t;
Statistics————————————————————————————— 79 recursive calls
4 db block gets 82 consistent gets 1 physical reads 0 redo size 369 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed我们可以看到consistents gets下降,为什么?因为在这个例子中优化器计算行的数目使用了索引,而不是表
评论
Tom
我们计算命中率的时候,使用的是(1-(phycial_read/(db_block_get+consistance get))
但是根据你的回答,我想,consistents gets或者db_block_gets是物理读(不是逻辑读)
你能解释下吗?
答
db_block_gets + consistent_gets = LOGICAL IO
physical_reads = PHYSICAL IO
我看不出来我在那里误导了你,你能指出那个地方告诉你他们是物理IO?
问
我想我在逻辑io和物理io这个地方困惑了,非常抱歉(不是你的错)
但是我还是困惑
如果我是第一次执行这个查询,没有东西在内存中,那么是不是db_block_gets和consistents gets将是物理读(我说的对吗?)
如果我第二次进行查询,很多block将在内存中,这里我的是逻辑io,对吗
答
你可能是对的,也可能不对.其他的查询或者是操作可能将这些数据已经cache到内存中.
另外一个观点,你可能是对的,可能是不对,依据于
影响到的数据的量
Buffer cache的大小
系统上在作什么别的操作
系统上使用的其他的功能(例如:并行查询)
通常,你希望第二次执行所有的都是逻辑io
3 Comments to “一致性获取―――非常迷惑”
Write a comment
You need tologin.

非常好,多谢你的翻译,希望多翻译,也谢谢tom &
Hello! Good Site! Thanks you! sixhrlojiyutua
坐在电脑前面时间太久,早就过了医生警告过的期限,和你也认识太久了,早就过了成为恋人的期限。记得那天你推开丹枫白露的门时候,我就在惊奇。深色的玫瑰花茶,配合着斜斜的阳光,wow gold闪烁跳跃的梦幻,有些眩目,令人不知所措。你突然问,为什么我和你不是恋人? 我倒茶的手僵硬了会。带点心虚的感觉,仿佛无意被人窥知了某个阴暗的角落, 我看着茶杯说,如果我们都相信爱情,那么,也许我们会是。或者说:我希望我们是。只是,我们都太过清楚对方,太过了解对方,太过知道两颗原子靠近可以产生的毁灭的力量。world of warcraft gold于是,我们都沉默。爱情必须是要来自我们心里最深处的原始的感觉,甚至可以说是一种本能,但是我们都已经遗忘这种原始。我们都是衣冠楚楚的都市人。我们隔着玻璃试管张大眼睛相互张望着。从我们认识的第一天开始,我们就知道。但是我们之间的化学反应因为缺少某种适当的条件,最后,只有变成透明而坚固的结晶,wow gold kaufen映照彼此,以冰冷而绝对的方式。 我喜欢你吗?也许。我爱你吗?不知道。我们是都从来不相信爱情的。对于不存在的东西,又叫人如何去相信对于这个问题只是简单的相信和不相信的选择题,但是要回答这个问题,我们总是要沉咛很久,终于在详细的数过若干理由后,用很理智而清晰的声音回答:是的,我不相信。我见过她的,我想她是合适你的。我也会找到合适我的人。buy wow gold而我们还没有靠近,就会已经被互相的碎片扎得鲜血淋漓。 很多时候,我在想,这样的痛澈心肺会不会是爱情的感觉。全身痉挛,纠结在一起,无法呼吸,就算用肉体的疼痛也不能解决的痛,这是不是爱情?但是你告诉我,你仍然不相信爱情。我相信嬰兒的眼睛我不信說謊的心我相信鹹鹹的淚水我不信甜甜的柔情我相信輕拂的風我不信流浪的雲我相信患難的真情我不信生生世世的約定是不是變成石wow geld堆我的心就不會再痛是不是別開頭去你就感覺不到我的深情這是我的愛情宣言我要告訴全世界這是我的愛情宣言我要告訴全世界是的,我也不相信爱情。你习惯他的呵护,习惯他的温柔,习惯他的淘气,习惯他的笑容甚至在不知不觉中,你习惯用他的方式微笑,用他的方式温柔 你们彼此互相依赖,依赖着这甜蜜的习惯每天固定的,你也习惯在特定时间听到电话铃声响起或者是清晨你还在梦? 或者是你忙完一天回到家的深夜? wow gold电话铃声响起,你用最温柔的声音期待着是他的回应当传来的声音不是他时,你总是会有那么一点点的失望因为对他甜蜜的习惯然后有一天你们分手了,你难过、伤心、失望与不舍因为你还是一样依赖着那习惯,但是你却必须舍弃「习惯」的权利你不再有权利习惯他的呵护、温柔、淘气与笑容你有了新的习惯 你开始习惯想到他时流着眼泪及想着逝去的记忆你开始world of warcraft gold习惯每天睡前不再有他的耳语你开始习惯每天日落前站在窗前看着夕阳沉默不语你开始习惯直到有一天,你忙得忘了这些习惯你不再习惯 不再习惯对着夕阳发呆才猛然发现很久、很久没有想起他的温柔了你甚至有些忘了他的样子,模模糊糊的,你只记得他有着一头的直发你只记得他有件美丽的蓝衬衫,你只记得他曾经有着那样好看的笑容不过wow po,都已经是模模糊糊的了. 那时候,逝去的爱情终於变得美丽,不再有遗憾我们害怕失去爱情也是害怕失去对一个人甜蜜的『习惯』或 我们并不是真的失去『习惯』而是试着习惯没有那些习惯的生活这,也是一种习惯. 我最近……wow or我知道他已经结婚很久了……今天才知道……还好,那时我不在此地还好,我只是知道这个还好,我现在刚好坚强还好,我可以让眼泪无声的还好,我们已经很多年不见还好,还好你已经走进婚姻的围城我也应该从回忆中向外跑只是,未讲完的很多话我只能在心底深埋,将他们堆成一个坟墓连同我们的情与怨深埋在心底化成一滴永远不会流下的泪珠儿挂在我的心上永远永远永歪歪,原谅我我不可能说出祝福的话但我相信你会过得很只能用微笑的眼泪祝福你。 假如,wow gold爱有天意希望再不要听到你的消息再不会与你相遇因为,我不知道当我再一次面对你的时候我是不是能不哭泣但是今天就让我流泪让我向你告别向过去告别向思念告别向痛苦告别向我们曾共同拥有过的青梅岁月告别歪歪,你永远也不知道你的离开,使我的泪流成泪海我的心像一只孤船居无定所歪歪,歪歪,歪歪呀每次呼唤你的名字,总有泪在眼角让我最后一次因你哭泣最后一次,最后一次那根思念的刺如果神灵怜悯,我希望,,今生不会再见到你…… 唉~~~ 大过年的,world of warcraft gold我却超郁闷~~觉得自己傻死了,可我,真不知道怎么办??卿有心事向谁说,寄予春风化情愁我都要超级崩溃了~~~我怎么这么脆弱呀???我的“天使与魔鬼”一说,怎么没人认同呢?真怀疑自己这些年的沉默,是不是语言表达能力下降了??自从爸妈分开,我最喜欢的声音是笛子。我喜欢它的悠扬……它让我觉得沉郁的心灵,祛浊扬清。。。我好饿…… 可我一点东西也吃不下去,真的是体会到食不下咽了唉,何必这样堕落??太不值得了也许我真的不适合谈感情……孤月游侠,你认命吧~~ 从小就喜欢看书,看画报,看儿童报,少年报,看很多的故事书,安徒生童话,格林童话,白俄罗斯童话wow gold kaufen,365夜童话……童话书真的好害人。前不久看一篇文章,有专家指出,童话中的故事里,男女主角,不是漂亮的公主,就是英俊的王子。于是每个傻姑娘,每个傻小子,都在想着自己的王子骑白马,可爱的公主穿白纱。唉,这篇文章出现得太晚了,我也被害了~~~等到上初中,同宿的高年级姐姐总是看琼瑶,我也沉迷其中。《紫贝壳》中逆来顺受的佩青,《碧云天》中为情所苦的依云、飘然而去的碧菡,《失火的天堂》里那个可怜的豌豆花,《鬼丈夫》里抱着丈夫牌位成亲的乐梅,《庭院深深》里的投河的含烟buy wow gold…………原来我看了那么多的小说,我的爱情观必会多少受到影响初一的夏天,我抱着一本厚厚的《红楼梦》坐在走廊里看,老师笑我问真的能看得懂么?我没说话,我只是笑笑,但是,看到晴雯惨死,黛玉葬花,我怎会不流下眼泪??满纸荒唐言,一把辛酸泪。都云作者痴,谁解其中味?我呢?满纸看似荒唐言,难尽一把辛酸泪。都云作者太痴缠,盼君能解其中味。 我总是感叹人生,大一点,到了初三 ,碰到一个好朋友,阿门~~我知道了除了四大天王以外的其他歌星,于是我在同桌的善意的嘲弄中,喜欢上听张信哲的歌曲,那么干净的声音wow geld,让我觉得好像在云中漫步随着心情的变化,我再不停的换听歌曲。我这个人,越是一个人的时候越感性。一次,无意中听到《友谊地久天长》中间穿插着马丁? 路德 ?金的《I have a dream》,哎呀,也不知心里怎么就不是味了,眼泪就流了下来。我想,我常常会感动,为一个故事、为一首歌、为电影中的一个细节、为路边的一只小狗、为朋友的失恋……成长,是一种美丽的疼痛,可疼痛过后,却不见得能换来称心如意的美丽。苦难仍在继续,。。。。人生匆匆几载,却只为情所苦。欲将残心拜古佛,却不忍,wow gold大好年华负春光主人和狗一起到了天堂门前。一个天使拦住他俩,为难地说:“对不起,现在天堂只剩下一个名额,你们两个中必须有一个去地狱。”主人一听,连忙问:“我的狗又不知道什么是天堂,什么是地狱,能不能让我来决定谁去天堂呢?”天使鄙视地看了这个主人一样,皱起了眉头,她想了想,说:“很抱歉,先生,每一个灵魂都是平等的,你们要通过比赛决定由谁上天堂。”主人失望地问:“哦,什么比赛呢?”天使说:“这个比赛很简单,就是赛跑,从这里跑到天堂的大门,谁先到达目的地,谁就可以上天堂。不过,你也别担心,因为你已经死了,所以不再是瞎子,而且灵魂的速度跟肉体无关,越单纯善良的人速度越快。”主人想了想,同意了。天使让主人和狗准备好,就宣布赛跑开始。她满心以为主人为了进天堂,会拼命往前奔,world of warcraft gold谁知道主人一点也不忙,慢吞吞地往前走着。更令天使吃惊的是,那条导盲犬也没有奔跑,它配合着主人的步调在旁边慢慢跟着,一步都不肯离开主人。天使恍然大悟:原来,多年来这条导盲犬已经养成了习惯,永远跟着主人行动,在主人的前方守护着他。可恶的主人,正是利用了这一点,才胸有成竹,稳操胜券,他只要在天堂门口叫他的狗停下,就能轻轻松松赢得比赛。天使看着这条忠心耿耿的狗,心里很难过,她大声对狗说:“你已经为主人献出了生命,现在,你这个主人不再是瞎子,你也不用领着他走路了,你快跑进天堂吧!”可是,无论是主人还是他的狗,都像是没有听到天使的话一样,仍然慢吞吞地地往前走,好像在街上散步似的。 果然,离终点还有几步的时候,主人发出一声口令,狗听话地坐下了,天使用鄙视的眼神看着主人。这时,主人笑了,他扭过头对天使说:“我终于把我的狗送到天堂了,我最担心的就是它根本不想上天堂,只想跟我在一起……所以我才想帮它决定,请你照顾好它。”天使愣住了。主人留恋地看着自己的狗,又说:“能够用比赛的方式决定真是太好了,只要我再让它往前走几步,它就可以上天堂了。不过它陪伴了我那么多年,这是我第一次可以用自己的眼睛看着它,所以我忍不住想要慢慢地走,多看它一会儿。如果可以的话,我真希wow po望永远看着它走下去。不过天堂到了,那才是它该去的地方,请你照顾好它。” 说完这些话,主人向狗发出了前进的命令,就在狗到达终点的一刹那,主人像一片羽毛似的落向了地狱的方向。他的狗见了,急忙掉转头,追着主人狂奔。满心懊悔的天使张开翅膀追过去,想要抓住导盲犬,不过那是世界上最纯洁善良的灵魂,速度远比天堂所有的天使都快。所以导盲犬又跟主人在一起了,即使是在地狱,导盲犬也永远守护着它的主人天使久久地站在那里,喃喃说道:“我一开始就错了,这两个灵魂是一体的,他们不能分开……”