ITPub博客

首页 > 数据库 > 数据库开发技术 > 表的行链接引起性能问题

表的行链接引起性能问题

原创 数据库开发技术 作者:wmlm 时间:2008-10-31 18:13:35 0 删除 编辑

关键字 table chain_cnt pctfree

刚刚结束了一次系统调整活动,现将过程大概做个记录,以备后查。

一套生产系统650 的分区,AIX5.2 + ORACLE9207 + weblogic 单机,全省使用,运行了三四年也没有维护过,很稳定,但近来不断有人反映系统运行缓慢,问题反映到高层,任务即[@more@]

下达到我们身上。到现场后,首先了解应用系统的大致情况。此应用是夜间抽取数据,分析形成报表,白天大部分是查询,有部分业务是接收上传包,解析后入库。因此来看,这个系统也是个混合型。

其次,实际观察系统的运行状况,情况确实不太好,仅一个WEB系统上的用户登录,就需要大约2分钟,进去以后的查询更是目不忍睹。习惯性地配置服务链接数据库,打开PL/SQL登录,又是等了好久才进去!进去以后,随便查了几个表,响应速度还行。看看还没有安装perfstat;尝试TELNET,等了半天才进去,ls一下没反应,topas还没出结果,连接中断了。

找小机的管理员,了解其上的应用,才知道除了这个系统的数据库和JAVA应用之外,另外还有一个数据库。系统管理员重启了AIX。TELNET可以登录进去了。

开始收集AIX的一些信息。

系统内存8G,我们的三个JAVA应用计用内存3G,我们的数据库用了1.8G ,NND另外一个刚安装的综合办公模拟库用了3.6内存

vmstat的部分信息如下:

$ r

vmstat 2 30

System configuration: lcpu=4 mem=8192MB

kthr memory page faults cpu

----- ----------- ------------------------ ------------ -----------

r b avm fre re pi po fr sr cy in sy cs us sy id wa

1 0 1280279 2968 0 9 3 64 76 0 70 426 272 46 1 52 2

0 0 1280292 2953 0 1 0 0 0 0 33 172 189 18 0 82 0

2 0 1280372 2954 0 24 1 65 69 0 57 931 482 1 0 96 2

0 0 1280254 3292 0 23 2 133 229 0 71 621 283 3 1 93 3

0 1 1280363 3004 0 25 0 0 0 0 81 498 295 2 1 87 10

2 1 1280363 2914 0 20 29 1233 1793 0 527 1312 1159 9 3 63 26

0 1 1280363 2974 0 9 20 1623 2397 0 555 847 1106 2 3 71 24

1 1 1280432 2892 0 40 75 2465 3876 0 815 1467 1455 3 4 70 23

0 1 1280432 2885 0 38 85 1624 17225 0 583 998 1159 3 3 70 24

0 1 1280496 2968 0 1 93 905 8175 0 434 674 951 4 2 71 23

1 1 1280496 2900 0 0 23 650 4663 0 369 559 857 3 2 72 24

0 1 1280496 2944 0 0 17 520 2069 0 280 384 676 3 1 72 24

0 1 1280560 2932 0 1 91 1041 4185 0 499 655 1057 3 2 71 24

1 1 1280560 2953 0 0 148 2145 10274 0 735 1556 1272 5 4 69 22

0 1 1280623 2962 0 1 161 2467 18023 0 857 1357 1445 3 5 69 23

0 1 1280624 2908 0 2 383 1303 4597 0 891 1136 1328 6 3 69 22

1 1 1280624 2976 0 2 215 391 1977 0 272 2429 524 31 2 58 9

kthr memory page faults cpu

----- ----------- ------------------------ ------------ -----------

r b avm fre re pi po fr sr cy in sy cs us sy id wa

0 1 1276622 3108 0 80 3 712 1395 0 381 312 1140 9 2 60 29

1 110 1276650 2888 0 287 0 972 1602 0 1174 365 3804 15 4 52 29

1 1 1276733 2908 0 0 0 455 751 0 233 347 594 17 1 65 17

1 1 1276768 2956 0 0 0 521 662 0 269 437 667 24 1 61 13

2 1 1276832 2937 0 42 0 64 67 0 71 345 275 41 1 54 5

2 0 1276847 2902 0 9 0 0 0 0 39 273 208 34 0 65 1

0 0 1276847 2902 0 0 0 0 0 0 30 29 201 0 0 99 0

1 0 1276911 2923 0 22 1 65 69 0 56 334 238 1 0 97 2

0 1 1277055 3060 0 117 1 258 654 0 159 1116 690 4 1 82 13

0 0 1276831 3183 0 51 0 0 0 0 121 366 384 1 2 91 6

再看看topas,发现几个oracle进程占用CPU较高,也不是一直占用居高不下;另外JAVA进程虽然CPU占用不高,但换页不少;找进程代码去数据库查查看在运行什么SQL语句。

找了几个SQL语句,查看后,加索引进行调整(此类应用系统的特点是不能更改应用的SQL语句),再次在模块中测试,有改善,但不明显。

安装perfstat ,隔20分钟后,打个报告看看,部分内容如下:

Snap Id Snap Time Sessions Curs/Sess Comment

--------- ------------------ -------- --------- -------------------

Begin Snap: 1 28-Oct-08 17:50:09 42 18.0

End Snap: 2 28-Oct-08 18:11:05 43 17.8

Elapsed: 20.93 (mins)

Cache Sizes (end)

~~~~~~~~~~~~~~~~~

Buffer Cache: 512M Std Block Size: 8K

Shared Pool Size: 512M Log Buffer: 512K

Load Profile

~~~~~~~~~~~~ Per Second Per Transaction

--------------- ---------------

Redo size: 1,153.53 724,418.00

Logical reads: 10,035.20 6,302,104.50

Block changes: 2.06 1,295.00

Physical reads: 95.16 59,760.00

Physical writes: 7.55 4,741.50

User calls: 3.92 2,461.00

Parses: 0.91 571.00

Hard parses: 0.12 75.00

Sorts: 0.52 329.00

Logons: 0.00 1.00

Executes: 1.43 898.50

Transactions: 0.00

% Blocks changed per Read: 0.02 Recursive Call %: 56.77

Rollback per transaction %: 0.00 Rows per Sort: 6843.77

Instance Efficiency Percentages (Target 100%)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Buffer Nowait %: 100.00 Redo NoWait %: 100.00

Buffer Hit %: 99.11 In-memory Sort %: 99.70

Library Hit %: 93.52 Soft Parse %: 86.87

Execute to Parse %: 36.45 Latch Hit %: 100.00

Parse CPU to Parse Elapsd %: 12.90 % Non-Parse CPU: 99.57

Shared Pool Statistics Begin End

------ ------

Memory Usage %: 90.02 89.94

% SQL with executions>1: 4.01 4.48

% Memory for SQL w/exec>1: 4.11 4.90

Top 5 Timed Events

~~~~~~~~~~~~~~~~~~ % Total

Event Waits Time (s) Ela Time

-------------------------------------------- ------------ ----------- --------

CPU time 103 50.63

db file sequential read 98,390 94 46.40

latch free 180 3 1.61

db file scattered read 1,608 2 .95

control file parallel write 418 0 .18

接着看了一些后面的SQL语句,因为程序是由经验丰富的程序员做的开发,所以也没有找出明显的不妥之处。db file sequential read读较大Logical reads也较大。为什么呢?(分析往往是走马观花)当时机器上没有安装Spotlight,上网当了一个,安装配置,连接上就报了很多警告,最多的是如下的告警:

11.35% of rows fetches "continue" to another block (averaged over 30 seconds)

30.26% of rows fetches "continue" to another block (averaged over 30 seconds)

2.38% of rows fetches "continue" to another block (averaged over 30 seconds)

9.62% of rows fetches "continue" to another block (averaged over 30 seconds)

21.94% of rows fetches "continue" to another block (averaged over 30 seconds)

15.39% of rows fetches "continue" to another block (averaged over 30 seconds)

真高呀!意识到可能是row chain问题。找几个主要的业务表做个抽样分析,然后再查,发现问题很严重。部分表的统计如下:

CHAIN_CNT

NUM_ROWS

CHAIN_RATE

BLOCKS

543503

802620

67.7195

2076

3583108

5470460

65.5005

7368

56812509

100165380

56.7188

265495

3518020

7212800

48.7747

21706

37520

99770

37.6065

250

教程上说1%就比较严重,现在窜到67了,不让人活了!

和主管技术人员进行了沟通,等到晚上找两表先做了再看效果。

出去吃个饭休息休息。

天黑了,夜深了,开始行动,停应用,将表做好备份,修改存储参数pctfree改为50,(被主管技术人员建议降低为40),再恢复数据。

再次进行分析,好了,chains_cnt消失为0;

进入应用,查询,速度飞快。可是问题并没有就此结束。

次日再次进行查询,部分地市的数据查询速度快,部分地市的数据查询仍然很慢?Y ?

难道链接行又出现了,分析查询,果然, 一个表的链接率又升至1.3 !

找出早上8点之前运行过的与此表相关的SQL语句,发现有以下特征:

先删除本月数据

再插入本月数据的前几列

再更新本表的后几列

而后几列的数据长度占行长的70%

看来预留的40不够用。怎么办?

再来一次,折腾,这几年一直在折腾数据,不是导入导出,就是改来改去。人生就是如此,痛并快乐着,一入O门深似海。搞完后再来查询,恢复正常。

其它的随后再说吧,先解决主要矛盾。

-- 纯属娱乐,如有不妥之处,请阅者多指教。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/271063/viewspace-1012710/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: SPFILE与RAW
下一篇: oracle set events
请登录后发表评论 登录
全部评论

注册时间:2008-04-08

  • 博文量
    398
  • 访问量
    3716774