Oracle SQL 性能分析原理与实战演练

news2024/10/1 19:36:58

4a234cbe9970b7abedb280b5b55d2d1f.gif

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle SQL 性能分析原理与实战演练,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!

目  录

SQL 性能分析简介
SPA 的价值
SPA 实战演练
    1、创建 SPA 用户
    2、创建 SQL 调优集
    3、获取业务周期 AWR 快照点
    4、SQL 调优集加载数据
    5、查询 SQL 调优集
        删除 SQL 调优集
    6、传输 SQL 调整集的过程
执行 Oracle 11g 到 Oracle 19c 的升级迁移变更操作
    7、获取并分析 SQL 对比信息
        1)新建 SQL 性能分析任务。
        2)获取升级前 SQL 的执行信息。
        3)获取升级后 SQL 的执行信息。
    8、执行 SQL 性能分析对比
        1)升级前后 SQL 性能的对比。
        2)生成 SQL 性能分析报告。
        3)获取全部结果

SQL性能分析简介

SQL Performance Analyzer 简称 SPA

SQL 性能分析通过自动化识别和评估每个业务 SQL 语句变更前后的性能差异所产生的总体影响,并提供一份 SQL 整体性能评估报告,该报告显示了由于语句更改所带来的影响。对于会使性能变差的 SQL 语句,SPA 提供了执行计划详细信息及调整建议,以帮助我们提前纠正任何可能的负面结果,从而使变更对数据库 SQL 的负面影响降到最低。

f01a6ed6d3fb69f98e7a04e66b3bb593.png

我们可以通过 SQL 性能分析工具分析各种类型的数据库更改对 SQL 性能产生的影响,这里主要包括以下几大类。

  • 1)数据库升级。

  • 2)PDB 级别整合或用户层面整合。

  • 3)操作系统或硬件的配置变更。

  • 4)数据库层参数调整。

  • 5)统计信息更新。

  • 6)SQL 优化验证。

b059b27d291b76cf3b80bc01b3787d58.png

SQL 性能分析的主要工作流程具体如下。

1)目标环境搭建。
2)根据业务周期捕获生产端需要分析的 SQL,并将其存储在 SQL 调优集(SQL Tunning Set,STS)中。
3)将生产捕获到的 SQL 调优集打包传输到测试环境并导入。
4)在测试环境上创建 SQL 性能分析任务。
5)执行 SQL 调优集中的 SQL 语句,生成变更前的 SQL 执行信息。
6)执行系统变更(升级、迁移等)。
7)重新执行 SQL 调优集中的 SQ L语句,生成变更后的 SQL 执行信息。
8)比较和分析变更前后对 SQL 性能的影响,并生成整体的 SQL 性能评估报告。
9)调优性能下降的 SQL 语句。
10)重复执行步骤 6 到 8,直到达到预期的 SQL 性能目标。

db0861db1d46a7d7d6ee2eec83da80b4.png

ac4f298743472e6160ae6de4e859135e.png

f93b599d488b40bb27a582cb652cb283.png

f3ec8518d6bed69fa0bb928b75014b52.png

捕获 SQL 工作负载对生产系统的性能影响可以忽略不计,并且不应影响吞吐量。包含更多 SQL 语句的 SQL 工作负载将更好地代表应用程序或数据库的状态。这将使 SQL 性能分析器能够更准确地预测系统更改对 SQL 工作负载的潜在影响。因此,您应该捕获尽可能多的 SQL 语句。理想情况下,您应该捕获由应用程序调用或在数据库上运行的所有 SQL 语句。

您可以将捕获的 SQL 语句存储在 SQL 调优集中,并将其用作 SQL 性能分析器的输入源。SQL 调优集是一个数据库对象,包括一个或多个 SQL 语句,以及它们的执行统计信息和执行上下文。SQL 语句可以从不同的源加载到 SQL 调优集中,包括游标缓存、自动工作负载存储库 (AWR)、SQL 跟踪文件和现有的 SQL 调优集。使用 SQL 调优集捕获 SQL 工作负载使您能够:

  •  将 SQL 文本和任何必要的辅助信息存储在单个持久数据库对象中

  •  在 SQL 调优集中填充、更新、删除和选择捕获的 SQL 语句

  •  从各种数据源加载和合并内容,例如自动工作负载存储库 (AWR) 或游标缓存

  •  从捕获 SQL 工作负载的系统导出 SQL 调优集并将其导入另一个系统

  •  重用 SQL 工作负载作为其他顾问的输入源,例如 SQL Tuning Advisor 和 SQL Access Advisor


SPA 的价值

• 在最终用户受到影响之前可以识别 SQL 性能的衰减
• SPA 可以对发生任何变化的 SQL 执行计划所引起的影响进行帮助

  1. 数据库升级

  2. 优化统计信息更新

  3. 新建立的索引,物化视图,分区等

• 可以对成百上千的 SQL 声明自动进行跟踪-手工是不可能完成的
• 可以低系统影响下捕获 SQL 工作量负载
• 与修正衰减的 SQL 调优向导和 SQL 计划基线进行集成

SPA 实战演练

在要升级的原生产环境创建 SPA 专用用户。

1、创建 SPA 用户

set line  240 
col profile for a20 
set pages 999 
col username for a25 
col ACCOUNT_STATUS for a18 
select USERNAME,ACCOUNT_STATUS,CREATED,PROFILE,PASSWORD_VERSIONS,DEFAULT_TABLESPACE from dba_users where account_status='OPEN' order by CREATED asc;


CREATE USER SPAUSER IDENTIFIED BY Oracle;
GRANT CONNECT,RESOURCE,DBA TO SPAUSER;
GRANT ADVISOR TO SPAUSER;
GRANT SELECT ANY DICTIONARY TO SPAUSER;
GRANT ADMINISTER SQL TUNING SET TO SPAUSER;

2、创建 SQL 调优集

conn spauser/Oracle


begin
  DBMS_SQLTUNE.CREATE_SQLSET(SQLSET_NAME  => 'SPA_STS',
                             SQLSET_OWNER => 'SPAUSER');
end;
/

确认SQL调优集信息,命令如下:

select owner, name, STATEMENT_COUNT from dba_sqlset;

·SQLSET_NAME:自定义SQL调优集的名称。
·SQLSET_OWNER:指定进行SQL性能分析的用户。

COLUMN NAME FORMAT a20
COLUMN COUNT FORMAT 99999
COLUMN DESCRIPTION FORMAT a11
SELECT NAME, STATEMENT_COUNT AS "SQLCNT", DESCRIPTION
FROM   USER_SQLSET;

3、获取业务周期 AWR 快照点

select min(snap_id) min_id, max(snap_id) max_id
  from dba_hist_snapshot
 where end_interval_time between
       to_date('2023-01-19 09', 'yyyy-mm-dd hh24') and
       to_date('2023-01-19 21', 'yyyy-mm-dd hh24')
 order by 1;


   MIN_ID     MAX_ID
---------- ----------
     54803  54826

4、SQL 调优集加载数据

通过 AWR 报告中的 SQL 语句导入 SQL 调优集进行整体的 SQL 性能测试,命令如下:

set timing on
declare
  bid     NUMBER := '&begin_snap';
  eid     NUMBER := '&end_snap';
  stsname VARCHAR2(30) := 'SPA_STS';
  stsowner VARCHAR2(30) := 'SPAUSER';
  sts_cur dbms_sqltune.sqlset_cursor;
begin
  open sts_cur for
    select value(P)
      from table(dbms_sqltune.select_workload_repository(bid,
                                                         eid,
                                                         null,                                                         null,
                                                         null,
                                                         null,
                                                         null,
                                                         1,
                                                         null,
                                                         'ALL')) P;
  dbms_sqltune.load_sqlset(sqlset_name     => stsname,
                           populate_cursor => sts_cur,
                           load_option     => 'MERGE',
                           sqlset_owner     => stsowner);
end;
/


Enter value for begin_snap: 54803
Enter value for end_snap: 54826


Elapsed: 00:02:06.79

5、查询 SQL 调优集

set line 567 pages 9999 long 9999
COLUMN SQL_TEXT FORMAT a120 
COLUMN SCH FORMAT a15
COLUMN ELAPSED FORMAT 999999999
SELECT SQL_ID, PARSING_SCHEMA_NAME AS "SCH", SQL_TEXT, 
       ELAPSED_TIME AS "ELAPSED", BUFFER_GETS
FROM   TABLE( DBMS_SQLTUNE.SELECT_SQLSET( 'SPA_JIEKEXU' ) );


SELECT count(*)
FROM   TABLE( DBMS_SQLTUNE.SELECT_SQLSET( 'SPA_JIEKEXU' ) );


  COUNT(*)
----------
       380
范围描述
parsing_schema_name解析 SQL 的模式
elapsed_time此 SQL 语句所用总秒数的总和
buffer_gets此 SQL 语句的缓冲区获取总数(数据库访问块的次数)
SELECT SQL_ID, ELAPSED_TIME, FETCHES, EXECUTIONS
FROM   TABLE(DBMS_SQLTUNE.SELECT_SQLSET('SPA_STS'));
删除 SQL 调优集

可删除以前的或者测试的 SQL 调优集,本过程不需要这一步。

BEGIN
  DBMS_SQLSET.DROP_SQLSET( sqlset_name => 'SPA_STS' );
END;
/

6、传输 SQL 调整集的过程

DBMS_SQLTUNE 过程等效的 DBMS_SQLSET 过程描述
CREATE_STGTAB_SQLSETCREATE_STGTAB创建一个临时表来保存导出的 SQL 调优集
PACK_STGTAB_SQLSETPACK_STGTAB使用 SQL 调整集填充临时表
UNPACK_STGTAB_SQLSETUNPACK_STGTAB将暂存表中的 SQL 调优集复制到数据库中

46d6fda683081163fd9d896bced8a4ec.png

b40101c8e16fa183d4c76b2f796c0b7b.png

步骤如下:

  1. 在生产数据库中,使用 DBMS_SQLTUNE.PACK_STGTAB_SQLSET 或者 DBMS_SQLSET.PACK_STGTAB 将 STS 打包到一个 staging 表中。

  2. 使用 Oracle Data Pump 将 STS 从临时表导出到 .dmp 文件。

  3. 使用传输工具将 .dmp 文件从生产主机传输到测试主机,例如 scp.

  4. 在测试数据库中,使用 Oracle 数据泵将 STS 从文件导入到临时表。

  5. 使用 DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET 或者DBMS_SQLSET.UNPACK_STGTAB 将 STS 从临时表中解压缩。

本小节假定以下内容:

 具有回归 SQL 的 STS 驻留在当前版本中创建的生产数据库中。
 您在 Oracle Database 11g第 2 版 (11.2) 中创建的远程测试数据库上运行 SQL 性能分析器试验。
 您希望将 STS 从生产数据库复制到测试数据库并调整 SQL 性能分析器试验的回归。
 您想使用 Oracle Database Pump 在数据库主机之间传输 SQL 调优集。
 您使用 DBMS_SQLTUNE 而不是 DBMS_SQLSET.

https://docs.oracle.com/en/database/oracle/oracle-database/21/tgsql/managing-sql-tuning-sets.html#GUID-CD6EBF22-6A8B-4404-A155-A90FA16754C6

使用该 CREATE_STGTAB_SQLSET 过程创建一个临时表,以保留导出的 SQL 调整集(注意大小写)。如果你的数据库是通过 ADG、RMAN 升级上来的,那么不需要将调优集导出导入,其他方式则需要下面步骤导出导入到目标库。

BEGIN
  DBMS_SQLTUNE.CREATE_STGTAB_SQLSET ( 
    table_name  => 'T_11G_STAGING_TABLE'
,   schema_name => 'SPAUSER'
,   db_version  => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION 
);
END;
/

使用该 PACK_STGTAB_SQLSET 过程用 SQL 调整集填充中转表(注意大小写)。

BEGIN
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET (      
    sqlset_name         => 'SPA_STS'
,   sqlset_owner        => 'SPAUSER'
,   staging_table_name  => 'T_11G_STAGING_TABLE'
,   staging_schema_owner => 'SPAUSER'
,   db_version          => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION 
);
END;
/
Elapsed: 00:00:56.41




select owner,table_name,num_rows,last_analyzed 
from dba_tables where table_name like '%11G%';

a35ec0e3cd27a3c22c74a6e4d596eabf.png

源库导出表

col DIRECTORY_PATH for a90
select * from dba_directories;
expdp SPAUSER/Oracle DIRECTORY=BAKDUMP_DIR DUMPFILE=T_11G_STS.dmp TABLES=T_11G_STAGING_TABLE


$ expdp SPAUSER/Oracle DIRECTORY=BAKDUMP_DIR DUMPFILE=T_11G_STS.dmp TABLES=T_11G_STAGING_TABLE


Export: Release 11.2.0.4.0 - Production on Wed Feb 1 11:26:29 2023


Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SPAUSER"."SYS_EXPORT_TABLE_01":  SPAUSER/******** DIRECTORY=BAKDUMP_DIR DUMPFILE=T_11G_STS.dmp TABLES=T_11G_STAGING_TABLE 
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 877.3 MB
Processing object type TABLE_EXPORT/TABLE/PROCACT_INSTANCE
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "SPAUSER"."T_11G_STAGING_TABLE"             837.8 MB  166082 rows
Master table "SPAUSER"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SPAUSER.SYS_EXPORT_TABLE_01 is:
  /ora_bak/dump_dir/T_11G_STS.dmp
Job "SPAUSER"."SYS_EXPORT_TABLE_01" successfully completed at Wed Feb 1 11:27:10 2023 elapsed 0 00:00:39

。。。执行 Oracle 11g 到 Oracle 19c 的升级迁移变更操作。。。

19c 目标库导入表

impdp SPAUSER/Oracle DIRECTORY=PUBLIC_DUMP DUMPFILE=sts.dmp TABLES=MY_11G_STAGING_TABLE
impdp SPAUSER/Oracle DIRECTORY=PUBLIC_DUMP DUMPFILE=sts.dmp TABLES=MY_11G_STAGING_TABL


Import: Release 19.0.0.0.0 - Production on Fri Sep 30 20:42:03 2022
Version 19.12.0.0.0


Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
ORA-39060: table(s) dropped because of conflict with master table
Master table "SPAUSER"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "SPAUSER"."SYS_IMPORT_TABLE_01":  SPAUSER/******** DIRECTORY=PUBLIC_DUMP DUMPFILE=sts.dmp TABLES=MY_11G_STAGING_TABL 
Processing object type TABLE_EXPORT/TABLE/PROCACT_INSTANCE
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SPAUSER"."MY_11G_STAGING_TABL"             44.59 MB   71220 rows
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Job "SPAUSER"."SYS_IMPORT_TABLE_01" successfully completed at Fri Sep 30 20:43:19 2022 elapsed 0 00:01:13


impdp  \'/ as sysdba\' DIRECTORY=PUBLIC_DUMP DUMPFILE=sts.dmp TABLES=MY_11G_STAGING_TABLE

在测试数据库上,执行将 UNPACK_STGTAB_SQLSETSQL 调整集从中转表复制到数据库中的过程。

BEGIN
  DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (
    sqlset_name        => '%'
,   replace            => true
,   staging_table_name => 'MY_11G_STAGING_TABLE');
END;
/

7、获取并分析 SQL 对比信息

1)新建 SQL 性能分析任务。

指定 SQLSET_OWNER 和 SQL 调优集的参数值,创建 SQL 性能分析任务TASK_NAME,为后续对比升级前后的 SQL 性能做准备,命令如下:

VARIABLE t_name VARCHAR2(100);
EXEC :t_name := DBMS_SQLPA.CREATE_ANALYSIS_TASK(sqlset_name => 'SPA_STS',task_name => 'SPA_JIEKEXU', SQLSET_OWNER => 'SPAUSER');
·sqlset_name:指定之前创建的 SQL 调优集的名称。
·task_name:自定义 SQL 性能分析任务的名称。
·SQLSET_OWNER:指定 SPA 用户
2)获取升级前 SQL 的执行信息。

指定分析任务 TASK_NAME,获取升级前 SQL 的执行信息。
调用 EXECUTE_ANALYSIS_TASK 使用以下参数的过程:
 将该 task_name 参数设置为您要执行的 SQL 性能分析器任务的名称。

 execution_type 通过以下方式之一设置参数:

  1. 设置为 EXPLAIN PLAN 为 SQL 调优集中的所有 SQL 语句生成执行计划而不执行它们。

  2. 设置为 TEST EXECUTE(推荐)以执行 SQL 调优集中的所有语句并生成它们的执行计划和统计信息。指定时 TEST EXECUTE,过程生成执行计划和执行统计信息。执行统计信息使 SQL 性能分析器能够识别已改进或退化的 SQL 语句。除了生成执行计划之外,收集执行统计信息可以提高性能分析的准确性,但需要更长的时间。

  3. 设置为 CONVERT SQLSET 引用 SQL 试验的执行统计信息和计划的 SQL 调整集。还应指定执行参数的值 SQLSET_NAME 和 SQLSET_OWNER。

 使用参数指定名称以标识执行 execution_name。如果未指定,则 SQL 性能分析器会自动生成任务执行的名称。

 使用参数指定执行 execution_params 参数。对于指定的执行,execution_params 参数被指定为 ( name , value ) 对。例如

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(TASK_NAME      => 'SPA_JIEKEXU',
                                   EXECUTION_NAME => 'EXEC_BEFORE_UPGRADE11',
                                   EXECUTION_TYPE => 'CONVERT SQLSET');
end;
/
3)获取升级后 SQL 的执行信息。

升级变更完成后,指定分析任务 TASK_NAME,获取升级后 SQL 的执行信息,命令如下:

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(TASK_NAME      => 'SPA_JIEKEXU',
                                   EXECUTION_NAME => 'EXEC_AFTER_UPGRADE19',
                                   EXECUTION_TYPE => 'TEST EXECUTE');
end;
/

注意这一步耗时较长,建议放后台执行,本次耗时 Elapsed: 00:57:00.00,需要将以上捕获的 SQL 跑一遍,过程中可看到单核 CPU 100%。可用以下 SQL 查看预估时长及进度。

col TARGET for a30
Set line 456
Col opname for a15
Select INST_ID, SID,SERIAL#,OPNAME,TARGET,TARGET_DESC,SOFAR,TOTALWORK,UNITS,START_TIME,LAST_UPDATE_TIME,ELAPSED_SECONDS,SQL_ID
  from gv$session_longops
 Where SOFAR<>TOTALWORK
 --and sid=5464;


--查看等待事件 
SQL> select event,sql_id,sid,serial#,seconds_in_wait from gv$session where type<>'BACKGROUND' and status='ACTIVE' group by event,sql_id,sid,serial#,seconds_in_wait
order by seconds_in_wait desc;


EVENT                 SQL_ID               SID    SERIAL# SECONDS_IN_WAIT
----------------------------------------------------------------       ------------- ---------- ---------- ---------------
db file scattered read           7rv1cbyv6prnc       1555      49092     210
SQL*Net message to client           g05prwps9nva4       1662      53340       0


--查杀此会话
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
alter session set nls_timestamp_format='yyyy-mm-dd hh24:mi:ss';
col "KILL_SESS" for a66
select 'alter system kill session '''|| sid|| ','||serial# ||',@'||INST_ID || ''' immediate;' as KILL_SESS,program,machine,PREV_EXEC_START,LOGON_TIME from gv$session where sid=5464;

8、执行 SQL 性能分析对比

1)升级前后 SQL 性能的对比。

得到升级前后 SQL 执行的信息之后,就可以对比升级它们的执行性能了,下面从不同的维度(SQL 执行的时间、SQL 执行的 CPU 时间、SQL 执行的物理读、逻辑读等)进行对比分析。

对比升级前后 SQL 执行的时间,命令如下:

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name        => 'SPA_JIEKEXU',
                                   execution_type   => 'COMPARE PERFORMANCE',
                                   execution_name   => 'Compare_elapsed_time',
                                   execution_params => dbms_advisor.arglist
                                       ('execution_name1',
                                       'EXEC_BEFORE_UPGRADE11',
                                       'execution_name2',
                                       'EXEC_AFTER_UPGRADE19',
                                       'comparison_metric',
                                       'elapsed_time'));
end;
/

对比升级前后 SQL 执行的 CPU 时间,命令如下:

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name        => 'SPA_JIEKEXU',
                                   execution_type   => 'COMPARE PERFORMANCE',
                                   execution_name   => 'Compare_CPU_time',
                                   execution_params => dbms_advisor.arglist
                                       ('execution_name1',
                                       'EXEC_BEFORE_UPGRADE11',
                                       'execution_name2',
                                       'EXEC_AFTER_UPGRADE19',
                                       'comparison_metric',
                                       'CPU_TIME'));
end;
/

对比升级前后 SQL 执行的逻辑读,命令如下:

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name        => 'SPA_JIEKEXU',
                                   execution_type   => 'COMPARE PERFORMANCE',
                                   execution_name   => 'Compare_BUFFER_GETS',
                                   execution_params => dbms_advisor.arglist
                                       ('execution_name1',
                                       'EXEC_BEFORE_UPGRADE11',
                                       'execution_name2',
                                       'EXEC_AFTER_UPGRADE19',
                                       'comparison_metric',
                                       'BUFFER_GETS'));
end;
/

对比升级前后 SQL 执行的物理读,命令如下:

begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name        => 'SPA_JIEKEXU',
                                   execution_type   => 'COMPARE PERFORMANCE',
                                   execution_name   => 'Compare_disk_reads',
                                   execution_params => dbms_advisor.arglist
                                       ('execution_name1',
                                       'EXEC_BEFORE_UPGRADE11',
                                       'execution_name2',
                                       'EXEC_AFTER_UPGRADE19',
                                       'comparison_metric',
                                       'DISK_READS'));
end;
/
2)生成 SQL 性能分析报告,结果如图所示。

f34d62126cfd214097ca58ddfc9c9ccf.png

3)获取全部结果,命令如下:
ALTER SESSION SET EVENTS '31156 trace name context forever, level 0x400';
SET LONG 9999999 longchunksize 100000 linesize 200 head off feedback off echo off
spool 11g_19c_change_0218.html
SELECT DBMS_SQLPA.REPORT_ANALYSIS_TASK('SPA_JIEKEXU',
                                       'HTML',
                                       'TYPICAL',
                                       'ALL',
                                       NULL,
                                       100,
                                       NULL,
                                       NULL,
                                       NULL)
  FROM DUAL;
spool off

对比 SQL 的执行时间,生成对比报告,命令如下:

set trimspool on
set trim on
set pages 0
set long 999999999
set linesize 1000
spool spa_report_elapsed_time_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU', 'HTML', 'ALL','ALL', 
    top_sql=>300,execution_name=>'Compare_elapsed_time') FROM dual;
spool off;

对比 SQL 执行的 CPU 时间,生成对比报告,命令如下:

spool spa_report_CPU_time_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU', 'HTML', 'ALL','ALL', 
    top_sql=>300,execution_name=>'Compare_CPU_time') FROM dual;
spool off;

对比 SQL 执行的逻辑读时间,生成对比报告,命令如下:

spool spa_report_buffer_time_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU','HTML','ALL','ALL',
    top_sql=>300,execution_name=>'Compare_BUFFER_GETS') FROM dual;
spool off;

对比 SQL 执行的物理读时间,生成对比报告,命令如下:

spool spa_report_buffer_time_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU','HTML','ALL','ALL',
    top_sql=>300,execution_name=>'Compare_DISK_READS') FROM dual;
spool off;

获取错误信息,命令如下:

spool spa_report_errors_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU', 'HTML', 'errors','summary') 
    FROM dual;
spool off;

获取不支持的对象,命令如下:

spool spa_report_unsupport_0218.html
SELECT dbms_sqlpa.report_analysis_task('SPA_JIEKEXU', 'HTML', 'unsupported','all') 
    FROM dual;
spool off;

9、SQL性能分析报告总结

459e6d7100a7796124e78583ef36b8ae.png

cb841a493b6d9cf6fc0891f51425ab31.png

从本次升级前后 SQ L性能的对比报告来看,一共对比了 344 条 SQL 语句,执行计划改变的共计 148 条,性能改善的共计 10 条,性能下降的共计 7 条,性能不变的共计 287 条,带有报错信息的共计 0 条,不支持的共计 40 条。

根据性能报告,我们可以有针对性地对性能下降的 SQL 语句进行优化,根据上图点击红色部分 SQL_ID 点击进入便可查看相关 SQL 详情,进行优化,这里就不一一细说了,最近一个月的时间内都在搞核心库升级的事情,周末刚刚升级完,还有一堆事情需要处理,咱们就有机会再聊吧。

cac34487280fd2d90c98578255b47f57.png

官方文档参考链接

https://docs.oracle.com/en/database/oracle/oracle-database/21/ratug/index.html

全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,第一时间一起学习新知识!

————————————————————————————
公众号:JiekeXu DBA之路
CSDN :https://blog.csdn.net/JiekeXu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————

18c99d2872c073ed85c73739434911b2.gif

Oracle 表碎片检查及整理方案

OGG|Oracle GoldenGate 基础

2022 年公众号历史文章合集整理

2021 年公众号历史文章合集整理

2020 年公众号历史文章合集整理

Oracle 19c RAC 遇到的几个问题

OGG|Oracle 数据迁移后比对一致性

利用 OGG 迁移 Oracle11g 到 19C

OGG|Oracle GoldenGate 微服务架构

Oracle 查询表空间使用率超慢问题一则

国产数据库|TiDB 5.4 单机快速安装初体验

Oracle ADG 备库停启维护流程及增量恢复

Linux 环境搭建 MySQL8.0.28 主从同步环境

a759eefce346b76ff29a106cbcfef387.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

题解 # 二维矩阵最大矩形问题#

题目&#xff1a; 小明有一张N*M的方格纸&#xff0c;且部分小方格中涂了颜色&#xff0c;部分小方格还是空白。 给出N (2<Ns30)和M(2sMs30)的值&#xff0c;及每个小方格的状态(&#xff08;被涂了颜色小方格用数字1表示&#xff0c;空白小方格用数字0表示)&#xff1b; 请…

java泛型学习篇(一)

java泛型学习篇(一) 1 学习泛型前的传统思路 1.1 遍历集合中元素的方法 1.1.1 思路 ①用foreach进行遍历 ②把每个Object对象强转成所需类型 ③打印其值1.1.2 示例代码 import java.util.ArrayList; public class Generic01 {public static void main(String[] args) {lon…

机器学习:基于主成分分析(PCA)对数据降维

机器学习&#xff1a;基于主成分分析&#xff08;PCA&#xff09;对数据降维 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可…

JavaWeb--HTTP

HTTP1 简介2 请求数据格式2.1 格式介绍3 响应数据格式3.1 格式介绍3.2 响应状态码3.2.1状态码大类3.2.2常见的响应状态码3.3 自定义服务器目标&#xff1a; 理解HTTP协议和HTTP请求与响应数据的格式 1 简介 HTTP概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&a…

造成android UI卡顿的原因及解决方法

Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms&#xff0c;是因为 Android 设定的刷新率是 60FPS(Frame Per Second)&#xff0c;也就是每秒 60 帧的刷新率&#xff0c;约合 16ms 刷新一次。如果UI线程的执行时间超过16ms&#xff0c;则会产生丢帧…

JavaSE08-运算符

文章目录一、算术运算符1.字符参与运算2.字符串参与 运算二、赋值运算符三、自增自减运算符四、比较运算符五、逻辑运算符六、三元运算符算术运算符、赋值运算符、自增自减运算符、比较运算符、逻辑运算符、三元运算符一、算术运算符 1.字符参与运算 char类型参与算术运算&…

Jmeter使用教程

目录一&#xff0c;简介二&#xff0c;Jmeter安装1&#xff0c;下载2&#xff0c;安装三&#xff0c;创建测试1&#xff0c;创建线程组2&#xff0c;创建HTTP请求默认值3&#xff0c;创建HTTP请求4&#xff0c;添加HTTP请求头5&#xff0c;添加断言6&#xff0c;添加查看结果树…

BoostSearcher搜索引擎项目

BoostSearcher搜索引擎项目 1.BoostSearcher这个项目是什么&#xff1f; 答&#xff1a;一个为Boost文档建立索引的站内搜索引擎&#xff0c;简单的说就是一个类似于csdn站内文档搜索框。 项目展示&#xff1a; gitee:https://gitee.com/zxlfx/boost-search-engine-project …

二叉树——堆

一&#xff0c;树的概念及结构 1.树 4.结点的度&#xff1a;一个节点含有子树的个数称为该结点的度&#xff1b;如&#xff1a;A 的度为6. 5.叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b;如&#xff1a;B 6.非终端结点或分支节点&#xff1a;度部位0的结…

【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

每日一题——L1-085 试试手气(15)

L1-085 试试手气 我们知道一个骰子有 6 个面&#xff0c;分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态&#xff0c;即它们朝上一面的点数&#xff0c;让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙&#xff0c;每次摇出的结果都满足以下两个条件&#xff1a;…

【Java8】

1、接口中默认方法修饰为普通方法 在jdk8之前&#xff0c;interface之中可以定义变量和方法&#xff0c;变量必须是public、static、final的&#xff0c;方法必须是public、abstract的&#xff0c;由于这些修饰符都是默认的。 接口定义方法: public抽象方法需要子类实现 接口定…

TCP报文详解

目录 &#x1f407;今日良言:但尽全力,且让心安 &#x1f43c;一、TCP协议特点 &#x1f433;二、TCP协议段格式 &#x1f42f;三、TCP的10个核心机制 &#x1f41d;四、三次握手和四次挥手 &#x1f407;今日良言:但尽全力,且让心安 &#x1f43c;一、TCP协议特点 TCP :Tr…

OAuth 2.0 认证和攻击面

0x00 前提 最近在测试公司的 oauth 认证方面的问题&#xff0c;要再去熟悉一下这块&#xff0c;所以把这块写一下。 0x01 OAuth2.0 概念 OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;目前是最常见最通用的一个授权协议。 什么地方…

uni-app:获取当前经纬度解决方案+如何布置全局组件

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 一.布置全局组件 在我们开发的过程中&#xff0c;会碰到一个现象&#xff0c;就是在页面里面引入组件&#xff0c;总算要写import&#xff0c;components才能引用&#xff0c;这里给大家分享我们的一个…

JavaWeb--Tomcat

Tomcat1 简介1.1 什么是Web服务器2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件目标&#xff1a; 掌握Tomcat的使用掌握在IDEA中使用To…

CMake模块的使用和自定义模块

CMake模块的使用和自定义模块一、前言二、使用Find模块2.1、准备工作2.2、添加头文件路径和库文件2.3、< name >_FOUND 来控制工程特性三、编写自定义的Find模块3.1、 准备工作3.2、cmake 模块3.3、使用自定义的FindHELLO 模块构建工程3.4、如果没有找到hello library四、…

备战金三银四,熬夜半个月汇集大厂 Java 岗 1600 页面试真题

如果你不停地加班。却很少冒险&#xff0c;也很少学习&#xff0c;那你极大可能会陷入到内卷中。 为什么这么说呢&#xff1f;我们先来捋清楚「内卷」的概念&#xff1a; 「内卷化」简而言之就是&#xff1a;日复一日&#xff0c;越混越掉坑里。 所谓内卷化&#xff0c;指一种…