PLSQL_查询SQL的执行次数和频率(案例)

简介: 2014-12-25 Created By BaoXinjian 一、摘要 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致。

2014-12-25 Created By BaoXinjian

一、摘要


在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致。

如果执行频繁的SQL,往往容易遭遇一些并发性的问题。

那么如何查看ORACLE数据库某个SQL的执行频率/次数,潇湘隐者同学整理如下,借花献佛了 :)

 

方法1: 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数;

方法2:通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数;

方法3:AWR报告查看某个SQL的执行次数;

 

二、三种方法解析


1. 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数

(1). 缺点

但是这个值的有效性需要结合FIRST_LOAD_TIME来判断,因为V$SQLAREA或V$SQL中不保存历史数据,

具有一定的时效性,所以如果要查询很久以前的某个SQL执行次数是办不到的。

(2). 关于V$SQLAREA 栏位介绍

FIRST_LOAD_TIME        VARCHAR2(19)       Timestamp of the parent creation time

EXECUTIONS                 NUMBER                Total number of executions, totalled over all the child cursors

(3). 如何查询

SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
FROM V$SQLAREA
WHERE SQL_ID = '497wh6n7hu14f'

(4). 总结

如果此时清空共享池,那么你会发现V$SQLAREA中对应的SQL的EXECUTIONS次数清零了。

如果要查看某个时间段该SQL语句执行了多少次,那么必须在这两个时间段执行上面SQL语句,两次EXECUTIONS的差值表示这段时间内SQL语句的执行次数。

EXECUTIONS是全局的,往往不能查看某个会话或用户执行了多少次。这也是其局限性之一。

 

2. 通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数。

(1). 缺点

但是部分快照如果没有捕获到有些SQL。这样也就无法通过下面SQL语句查看执行次数。

也是就说这种方法是有缺陷的。执行越频繁的语句,也越容易被SNAPSHOT抓取到.

(2). 执行语法

  SELECT   M.SQL_ID,
           TO_CHAR (N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') "DATETIME",
           SUM (M.EXECUTIONS_DELTA) EXECUTIONS
    FROM   DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N
   WHERE       M.SNAP_ID = N.SNAP_ID
           AND M.DBID = N.DBID
           AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER
           AND M.INSTANCE_NUMBER = 1
           AND TO_CHAR (N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') = '2014-12-25'
           AND M.SQL_ID = '497wh6n7hu14f'
GROUP BY   M.SQL_ID, TO_CHAR (N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')
ORDER BY   M.SQL_ID

 

3. AWR报告查看某个SQL的执行次数,同上面一样,AWR报告也受SNAPSHOT影响。不一定捕获了你需要查询的SQL

 

4. 查看当前数据库执行次数最多的SQL,例如,查询执行最频繁的TOP 15的SQL语句。

SELECT   SQL_TEXT, EXECUTIONS
  FROM   (SELECT   SQL_TEXT,
                   EXECUTIONS,
                   RANK () OVER (ORDER BY EXECUTIONS DESC) EXEC_RANK
            FROM   V$SQLAREA)
 WHERE   EXEC_RANK <= 15;

 

5. 查看执行SQL的历史记录信息

  SELECT DBMS_LOB.SUBSTR (sql_text, 100, 1) SQL_SHORT,
         tab1.sql_id,
         DBMS_LOB.getlength (sql_text) SQL_Len,
         ROUND (TOTAL_WAIT / 1000000, 2) TOTAL_WAIT_SECS,
         ROUND (ELAPSED_TIME_DELTA / 1000000, 2) TOTAL_TIME_SECS,
         TO_CHAR (BEGIN_INTERVAL_TIME, 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN')
            Week_Day,
         BEGIN_INTERVAL_TIME,
         END_INTERVAL_TIME,
         EXEC_COUNT,
         AVG_CPU_TIME_SECS,
         AVG_ELAPSED_SECS,
         ROUND (ELAPSED_TIME_DELTA / 1000000, 0) ELAPSED_TIME_DELTA,
         ROUND (AVG_ROWS_PROCESSED, 1) AVG_ROWS_PROCESSED,
         PLAN_HASH_VALUE,
         MODULE,
         ACTION,
         PARSING_SCHEMA_NAME,
         (SELECT username
            FROM dba_users
           WHERE user_id = PARSING_USER_ID)
            PARSING_USER,
         AVG_BUFFER_GETS,
         AVG_DISK_READS,
         AVG_IOWAIT AVG_iowai_secs,
         AVG_CCWAIT AVG_ccwait_secs,
         AVG_CLWAIT AVG_clwait_secs,
         AVG_APWAIT AVG_apwait_secs,
         AVG_PX_SERVERS,
         AVG_PARSE_CALLS,
         tab1.SNAP_ID,
         tab1.INSTANCE_NUMBER,
         AVG_CELL_UNCOMPRESSED_BYTES,
         AVG_DIRECT_WRITES,
         AVG_IO_INTERCONNECT_BYTES,
         AVG_IO_OFFLOAD_ELIG_BYTES,
         AVG_IO_OFFLOAD_RETURN_BYTES,
         AVG_JAVEXEC_TIME,
         AVG_OPTIMIZED_PHYSICAL_READS,
         AVG_PLSEXEC_TIME_DELTA,
         AVG_SORTS_DELTA,
         -- BIND_DATA,    -- -- (Falta arreglar) listagg( (select * from table(dbms_sqltune.extract_binds(bind_data)), '#') WITHIN GROUP (ORDER BY 1)) Binds ,
         DBMS_LOB.SUBSTR (sql_text, 2000, 1) SQL_TEXT1,
         DBMS_LOB.SUBSTR (sql_text, 2000, 2001) SQL_TEXT2,
         DBMS_LOB.SUBSTR (sql_text, 2000, 4001) SQL_TEXT3,
         DBMS_LOB.SUBSTR (sql_text, 2000, 6001) SQL_TEXT4,
         DBMS_LOB.SUBSTR (sql_text, 2000, 8001) SQL_TEXT5,
         DBMS_LOB.SUBSTR (sql_text, 2000, 10001) SQL_TEXT6,
         DBMS_LOB.SUBSTR (sql_text, 2000, 12001) SQL_TEXT7,
         DBMS_LOB.SUBSTR (sql_text, 2000, 14001) SQL_TEXT8,
         DBMS_LOB.SUBSTR (sql_text, 2000, 16001) SQL_TEXT9,
         DBMS_LOB.SUBSTR (sql_text, 2000, 18001) SQL_TEXT10
    FROM DBA_HIST_SQLTEXT D,
         DBA_HIST_SNAPSHOT N,
         (  SELECT S.SQL_ID SQL_ID,
                   instance_number,
                   SUM (EXECUTIONS) EXEC_COUNT,
                   ROUND ( (SUM (CPU_TIME_DELTA) / SUM (EXECUTIONS)) / 1000000,
                          4)
                      AVG_CPU_TIME_SECS,
                   ROUND (
                      (SUM (ELAPSED_TIME_DELTA) / SUM (EXECUTIONS)) / 1000000,
                      4)
                      AVG_ELAPSED_SECS,
                   SUM (ELAPSED_TIME_DELTA) ELAPSED_TIME_DELTA,
                   ROUND ( (SUM (ROWS_PROCESSED_DELTA) / SUM (EXECUTIONS)), 4)
                      AVG_ROWS_PROCESSED,
                   PLAN_HASH_VALUE,
                   MODULE,
                   ACTION,
                   PARSING_SCHEMA_NAME,
                   PARSING_USER_ID,
                   ROUND (SUM (BUFFER_GETS_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_BUFFER_GETS,
                   ROUND (SUM (DISK_READS_DELTA) / SUM (EXECUTIONS), 0)
                      AVG_DISK_READS,
                   SNAP_ID,
                   ROUND ( (SUM (IOWAIT_DELTA) / SUM (EXECUTIONS)) / 1000000, 4)
                      AVG_IOWAIT,
                   ROUND ( (SUM (CCWAIT_DELTA) / SUM (EXECUTIONS)) / 1000000, 4)
                      AVG_CCWAIT,
                   ROUND ( (SUM (CLWAIT_DELTA) / SUM (EXECUTIONS)) / 1000000, 4)
                      AVG_CLWAIT,
                   ROUND ( (SUM (APWAIT_DELTA) / SUM (EXECUTIONS)) / 1000000, 4)
                      AVG_APWAIT,
                   ROUND (SUM (PX_SERVERS_EXECS_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_PX_SERVERS,
                   ROUND (SUM (PARSE_CALLS_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_PARSE_CALLS,
                   ROUND (SUM (CELL_UNCOMPRESSED_BYTES_DELTA) / SUM (EXECUTIONS),
                          4)
                      AVG_CELL_UNCOMPRESSED_BYTES,
                   ROUND (SUM (DIRECT_WRITES_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_DIRECT_WRITES,
                   ROUND (SUM (IO_INTERCONNECT_BYTES_DELTA) / SUM (EXECUTIONS),
                          4)
                      AVG_IO_INTERCONNECT_BYTES,
                   ROUND (SUM (IO_OFFLOAD_ELIG_BYTES_DELTA) / SUM (EXECUTIONS),
                          4)
                      AVG_IO_OFFLOAD_ELIG_BYTES,
                   ROUND (SUM (IO_OFFLOAD_RETURN_BYTES_DELTA) / SUM (EXECUTIONS),
                          4)
                      AVG_IO_OFFLOAD_RETURN_BYTES,
                   ROUND (SUM (JAVEXEC_TIME_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_JAVEXEC_TIME,
                   ROUND (
                      SUM (OPTIMIZED_PHYSICAL_READS_DELTA) / SUM (EXECUTIONS),
                      4)
                      AVG_OPTIMIZED_PHYSICAL_READS,
                   ROUND (SUM (PLSEXEC_TIME_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_PLSEXEC_TIME_DELTA,
                   ROUND (SUM (SORTS_DELTA) / SUM (EXECUTIONS), 4)
                      AVG_SORTS_DELTA,
                   SUM (
                      IOWAIT_DELTA + CCWAIT_DELTA + CLWAIT_DELTA + APWAIT_DELTA)
                      TOTAL_WAIT,
                   MAX (BIND_DATA) BIND_DATA
              FROM (SELECT S.*,
                           DECODE (EXECUTIONs_DELTA, 0, 1, EXECUTIONS_DELTA)
                              EXECUTIONS
                      FROM DBA_HIST_SQLSTAT S) S
             WHERE 1 = 1 -- and ( PARSING_SCHEMA_NAME like 'EUS%' )  -- Filter by schema name
          GROUP BY S.SQL_ID,
                   instance_number,
                   S.SNAP_ID,
                   PLAN_HASH_VALUE,
                   MODULE,
                   ACTION,
                   PARSING_SCHEMA_NAME,
                   S.INSTANCE_NUMBER,
                   PARSING_USER_ID
            HAVING ROUND (
                      (SUM (ELAPSED_TIME_DELTA) / SUM (EXECUTIONS)) / 1000000,
                      4) >= 10                             -- Filter >= n secs
          ORDER BY 5 DESC) TAB1
   WHERE D.SQL_ID = TAB1.SQL_ID AND TAB1.snap_id = N.snap_id --   and upper(tab1.module) like '%PKG_BATCH_PROCESSES_SDM%'
         AND d.sql_id IN ('6tmcqrydfgdtc') --  AND D.SQL_ID in ( select distinct sql_id from DBA_HIST_ACTIVE_SESS_HISTORY where top_level_sql_id = '85xkhugz5kt8h'  )
                                           --  AND upper(DBMS_LOB.SUBSTR (sql_text, 100, 1)) LIKE 'INSERT%'
                                           --   AND upper(DBMS_LOB.SUBSTR (sql_text, 1000, 1)) LIKE 'SELECT%'
                                           -- AND upper(DBMS_LOB.SUBSTR (sql_text, 3000, 1)) LIKE '%INACTIVE%'
         AND BEGIN_INTERVAL_TIME > SYSDATE - 60
-- and BEGIN_INTERVAL_TIME between to_date('05/09/2013 07:50:00', 'DD/MM/YYYY hh24:mi:ss') AND    to_date('05/09/2013 16:10:00', 'DD/MM/YYYY hh24:mi:ss')
-- and  BEGIN_INTERVAL_TIME >= (SELECT  job_start_datetime - (2/24)  FROM   job_status  WHERE   job_name = 'RAVLDBSK' AND cob_date =  (SELECT  current_cob_date  FROM  eus_cob))
-- and  BEGIN_INTERVAL_TIME <= (SELECT job_end_datetime + (2/24)  FROM   job_status  WHERE   job_name = 'RAVLDBSK' AND cob_date =  (SELECT  current_cob_date  FROM  eus_cob))
--   order by AVG_ELAPSED_SECS DESC
-- order by ELAPSED_TIME_DELTA DESC
ORDER BY BEGIN_INTERVAL_TIME DESC
-- order by TOTAL_WAIT_SECS desc;

 

Thanks and Regards

部分参考:潇湘隐者 - http://www.cnblogs.com/kerrycode/p/4111746.html

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
25天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
16 0
sql语句加正则 简化查询
|
5天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
5天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
11天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
16天前
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
22天前
|
SQL 运维 监控
面经:Presto/Trino高性能SQL查询引擎解析
【4月更文挑战第10天】本文深入探讨了大数据查询引擎Trino(现称Trino)的核心特性与应用场景,适合面试准备。重点包括:Trino的分布式架构(Coordinator与Worker节点)、连接器与数据源交互、查询优化(CBO、动态过滤)及性能调优、容错与运维实践。通过实例代码展示如何解释查询计划、创建自定义连接器以及查看查询的I/O预期。理解这些知识点将有助于在面试中脱颖而出,并在实际工作中高效处理数据分析任务。
50 12
|
23天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
26天前
|
SQL 关系型数据库 MySQL
sql查询指定日期前n天数据
sql查询指定日期前n天数据
|
23天前
|
SQL 安全 算法
【SQL server】玩转SQL server数据库:第四章 数据库安全性
【SQL server】玩转SQL server数据库:第四章 数据库安全性
65 12
|
6天前
|
SQL 数据可视化 算法
SQL Server聚类数据挖掘信用卡客户可视化分析
SQL Server聚类数据挖掘信用卡客户可视化分析
15 2