项目:
某**Boss项目
问题:
查询报表慢无法验收
分析及处理方法:
1:通过awr发现pga命中率很低
PGA Cache Hit %
W/A MB Processed
Extra W/A MB Read/Written
74.97
108,656
36,272
解决过程:
查看系统总内存为32G,SGA为22G,PGA只有2G
更改数据内存:
alter system set sga_max_size=18G scope=spfile;
alter system set sga_target=18G scope=spfile;
alter system set pga_aggregate_target=8G scope=spfile;
2:通过trace 发现Bug 9772888 (查询报表慢,应该跟它没关,但是发现了问题,顺便解决)WARNING:Could not lower the asynch I/O limit to 160
for SQL direct I/O. It is set to -1
解决过程:
(1):下载patch 9772888
(2):解压补丁:进入9772888目录 执行$ORACLE_HOME/OPatch/opatch apply
$ORACLE_HOME/OPatch/opatch lsinventory detail (查看命令)
3:在应用端查询报表,通过jboss后台抓取相应sql或使用sql语句抓取后台sql,查看执行计划,发现执行计划没有什么异常。再通过 中的优化工具找出等价最优sql语句,之后让开发更新程序。
4:再通过Oracle本身自带的SQL Tuning Advisor 自动优化一下相应sql
具体步骤:
(1):进入Boss系统应用用户
DECLARE
task_name VARCHAR2(200);
my_sqltext CLOB;
user_name VARCHAR2(30);
sql_text VARCHAR2(5000);
description VARCHAR2(200);
my_task_name VARCHAR2(200);
BEGIN
my_sqltext :='sql语句';
my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => my_sqltext,
user_name => 'SMS3',
scope => 'COMPREHENSIVE',
time_limit => 600,
task_name => 'test_sql_tuning_task1',
description => 'Task to tune a query');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => 'test_sql_tuning_task1');
END;
/
(2):通过select task_name,ADVISOR_NAME,STATUS from user_advisor_tasks; 查看是否执行完成,如果status是EXECUTING,则表示任务正在执行,如果为completed,则任务已执行完成。
(3):查看语句优化建议
set long 999999
set LONGCHUNKSIZE 999999
set serveroutput on size 999999
set linesize 200
select dbms_sqltune.report_tuning_task('test_sql_tuning_task1') from dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_SQL_TUNING_TASK1')
(4):根据建议,优化语句。
(5):删除任务
exec dbms_sqltune.drop_tuning_task('TEST_SQL_TUNING_TASK1');
5:将优化后的sql提供给开发,打完补丁,更新到Boss应用系统后,查询时间从之前的15-20分钟,提高到1分钟以下。