大家来分析分析这个10046

[复制链接]
查看11 | 回复9 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
本帖最后由 bibabo 于 2011-10-16 16:30 编辑
同样的表结构同样表记录已经记录数据一样在两个机器上运行不一样A机器性能好,但是执行时间慢,B性能不好但执行快?
A机器(10046,需要12秒多,blocksize=16k):
update temp_abc a
set cola =
(select max(cola)

from temp_abc b
where (b.colb = a.colb AND b.colb'0')

OR (b.colc = a.colc AND b.colc'0'))
where cola is null
or cola = '0'
call count cpuelapsed diskquerycurrentrows
------- -------------- ---------- ---------- ---------- --------------------
Parse10.00 0.00
0
0
0 0
Execute1 12.3912.10
068250 98184885
Fetch00.00 0.00
0
0
0 0
------- -------------- ---------- ---------- ---------- --------------------
total2 12.3912.10
068250 98184885
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 70
Rows Row Source Operation
----------------------------------------------------------
0UPDATETEMP_ABC (cr=68250 pr=0 pw=0 time=12103126 us)
4885 TABLE ACCESS FULL TEMP_ABC (cr=14 pr=0 pw=0 time=4941 us)
4874 SORT AGGREGATE (cr=68236 pr=0 pw=0 time=11956691 us)
4902TABLE ACCESS FULL TEMP_ABC (cr=68236 pr=0 pw=0 time=11901495 us)

B机器(需要4秒多,比A的内存和cpu都差不少,blocksize=8k)
update temp_abc a
set cola =
(select max(cola)

from temp_abc b
where (b.colb = a.colb AND b.colb'0')

OR (b.colc = a.colc AND b.colc'0'))
where cola is null
or cola = '0'

call count cpuelapsed diskquerycurrentrows
------- -------------- ---------- ---------- ---------- --------------------
Parse10.00 0.00
0
0
0 0
Execute14.00 3.91
0 151125 98624885
Fetch00.00 0.00
0
0
0 0
------- -------------- ---------- ---------- ---------- --------------------
total24.00 3.91
0 151125 98624885
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
----------------------------------------------------------
0UPDATETEMP_ABC (cr=151125 pr=0 pw=0 time=3913671 us)
4885 TABLE ACCESS FULL TEMP_ABC (cr=31 pr=0 pw=0 time=4990 us)
4874 SORT AGGREGATE (cr=151094 pr=0 pw=0 time=3826103 us)
4902TABLE ACCESS FULL TEMP_ABC (cr=151094 pr=0 pw=0 time=3797654 us)

时间耗费在在Execute 阶段(都是在逻辑读),但是不知道为什么性能好的机子耗时却长?
大家有什么办法莱更进一步分析时间到底耗费在什么地方了。

回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
主要 区别在这里:
第一个4902TABLE ACCESS FULL TEMP_ABC (cr=68236 pr=0 pw=0 time=11901495 us) 时间是 11901495
第二个4902TABLE ACCESS FULL TEMP_ABC (cr=151094 pr=0 pw=0 time=3797654 us) 时间是 3797654
这里相差太大,导致执行时间不一样。很奇怪的就是,第一个 cr 比 第二个 cr 小很多。 你对第一个表alter table move一下呢。


回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
1.不能简单的通过主频或者CPU型号,就认为某台主机上的CPU性能更好
2. 分析是否A 机上有其他消耗CPU 的应用,导致服务进程无法获得足够的CPU时间片,可以做个AWR或ASH说明该问题
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
本帖最后由 maolinxie 于 2011-10-16 13:49 编辑
a blocksize 8k
b blocksize 16k
假设db_file_multiblock_read_count都为16
则a语句需要两次读完的块,b只要一次就读完
还可以做一个10045比较下

回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
lbs1988 发表于 2011-10-16 12:22
主要 区别在这里:
第一个4902TABLE ACCESS FULL TEMP_ABC (cr=68236 pr=0 pw=0 time=11901495 us)...

不好意思,是我写错了了,第一个cr小应该是因为blocksize大的原因,两个cr大约1:2的关系,正好是blocksize之间的差距
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
maolinxie 发表于 2011-10-16 13:47
a blocksize 8k
b blocksize 16k
假设db_file_multiblock_read_count都为16

实在不好意思,是我写反了,比较粗心,现在就是在cr小的机器上,反而耗时比较长
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
call count cpuelapsed diskquerycurrentrows
------- -------------- ---------- ---------- ---------- --------------------
Parse10.00 0.00
0
0
0 0
Execute1 12.3912.10
068250 98184885
Fetch00.00 0.00
0
0
0 0
还有就是在execute阶段,主要怎么莱更进一步,看cpu耗时在什么地方了?
大家有什么办法或者思路没有呢
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
bibabo 发表于 2011-10-16 16:33
实在不好意思,是我写反了,比较粗心,现在就是在cr小的机器上,反而耗时比较长

见我的回复
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
本帖最后由 bibabo 于 2011-10-17 16:20 编辑
maclean 发表于 2011-10-16 16:37
见我的回复
这个事单sql的awr
Plan Statistics
% Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
Stat Name Statement Total Per Execution % Snap Total
Elapsed Time (ms) 7,875 3,937.46 0.04
CPU Time (ms) 8,064 4,031.89 0.04
Executions 2
Buffer Gets 322,125 161,062.50 0.00
Disk Reads 0 0.00 0.00
Parse Calls 2 1.00 0.00
Rows 9,770 4,885.00
User I/O Wait Time (ms) 0
Cluster Wait Time (ms) 0
Application Wait Time (ms) 0
Concurrency Wait Time (ms) 0
Invalidations 0
Version Count 2
Sharable Mem(KB) 46

Execution Plan
IdOperationNameRowsBytesCost (%CPU) Time
0UPDATE STATEMENT43973 (100)
1 UPDATETEMP_ABC

2 TABLE ACCESS FULLTEMP_ABC4885147K 8 (0) 00:00:01
3 SORT AGGREGATE131
4 TABLE ACCESS FULL TEMP_ABC51558 (0) 00:00:01


回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
应该是数据分布的问题!
比如类似这样:
primary idcolA
1
0
2
5
....
1000 0
1001 3
.....
2000 0
A机器与B机器读取的数据都一样!但blocksize=16K比8K,无形中每次都多读了大约8K的数据,这样连个的执行时间肯定相差很多。同样,如果你的数据colA、colB\colC相对比较集中的话,那么blocksize=16K比8K在读取数据更有优势,执行时间也就短了;
你可以自己借助dbms_rowid去验证,或者重定义表以colA(B/C)来排序插入新表再对比测试。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行