从hash_value提取sql_id

时间:2019-06-30 07:57:10

标签: oracle hash oracle11g

我有查询的sql哈希值。

我没有sqltext,计划哈希或sql_id-只有sql的哈希值。

当我查询v$sql视图时,没有结果(我想sql已经不在内存中了):

select * from v$sql where hash_value = 'hv_Example';

是否可以通过hash_value实现sql_id?

我没有找到包含哈希值和sql_id的视图...

1 个答案:

答案 0 :(得分:0)

V$SQL同时包含HASH_VALUESQL_ID,但不会永远存在。

根据Tanel Poder's blogHASH_VALUE可以从SQL_ID派生,但是逆运算是不可能的。但是将HASH_VALUE转换为SQL_ID仍然无法解决您的问题。

首先,我不确定为什么您可以访问HASH_VALUE但不能访问SQL_IDSQL_ID更常用于性能调整。无论提供了HASH_VALUE的程序或源,都应修改为返回SQL_ID

但是,无论您拥有什么值,这里的真正问题是数据没有永久存储在V$SQL中。随着语句变旧,它们将从共享池中删除,并从V$SQL中消失。另外,如果您使用的是集群系统,请确保使用GV$SQL

如果您使用的是Enterprise Edition,并且已获得Oracle Diagnostic Pack的许可,则可以使用以下两个语句之一查找历史SQL_ID值:

select sql_id
from gv$active_session_history
where sql_full_plan_hash_value = 'XYZ';

select sql_id
from dba_hist_active_sess_history
where sql_full_plan_hash_value = 'XYZ';

GV$ACTIVE_SESSION_HISTORY中的数据通常持续约一天。 DBA_HIST_*中的数据默认情况下会保留8天,但可以配置。您可以使用以下查询检查AWR保留:select retention from dba_hist_wr_control;

如果HASH_VALUE的保留期限小于保留期限,但仍不在AWR中,则您可以忽略它。 ASH和AWR使用采样,这意味着它们无法捕获数据库中发生的所有 。 ASH每秒钟采样一次,AWR每10秒采样一次。

很多人都在为这个概念而苦恼,但是对采样的想法很有帮助。捕获所有信息的系统(如跟踪所有内容)不堪重负,并占用了过多的空间和处理能力。如果我们正在查看性能问题,那么我们不会关心8天之内超过10秒不会发生的事情。