我有查询的sql哈希值。
我没有sqltext,计划哈希或sql_id-只有sql的哈希值。
当我查询v$sql
视图时,没有结果(我想sql已经不在内存中了):
select * from v$sql where hash_value = 'hv_Example';
是否可以通过hash_value实现sql_id?
我没有找到包含哈希值和sql_id的视图...
答案 0 :(得分:0)
V$SQL
同时包含HASH_VALUE
和SQL_ID
,但不会永远存在。
根据Tanel Poder's blog,HASH_VALUE
可以从SQL_ID
派生,但是逆运算是不可能的。但是将HASH_VALUE
转换为SQL_ID
仍然无法解决您的问题。
首先,我不确定为什么您可以访问HASH_VALUE
但不能访问SQL_ID
。 SQL_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秒不会发生的事情。