本文档介绍了如何使用V$SQL视图、AWR & ASH数据或关联视图的数据字典查询来确定SQL语句关联文本的SQL_ID。
如何确定一个SQL语句的SQL_ID?
语句的SQL_ID可以在AWR或ASH报告中找到,或者使用V$SQL视图从数据库数据字典中找到。
如果SQL可以用一个特定的可识别的字符串或某种独特的注释来识别,如:/* TARGET SQL */,那么这将使其更容易被找到。
比如:
SELECT /* TARGET SQL */ * FROM dual; SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text FROM v$sql WHERE sql_text like 'SELECT /* TARGET SQL */%' SQL_ID PLAN_HASH_VALUE SQL_TEXT ------------- --------------- ---------------------------------------- 0xzhrtn5gkpjs 272002086 SELECT /* TARGET SQL */ * FROM dual
为方便起见,这里包含了plan_hash_value。
你也可以在V$SQL视图中使用一个可替换的变量找到SQL_ID:
SELECT sql_id, plan_hash_value, SUBSTR(sql_text,1,40) Text FROM v$sql WHERE sql_text LIKE '%&An_Identifiable_String%';
如果在v$sql中找不到这个SQL,你可以在AWR历史视图中找到它: DBA_HIST_SQLTEXT 和 DBA_HIST_SQLSTAT :
SELECT s.sql_id, s.plan_hash_value, t.sql_text, s.snap_id FROM dba_hist_sqlstat s, dba_hist_sqltext t WHERE s.dbid = t.dbid AND s.sql_id = t.sql_id AND sql_text LIKE 'SELECT /* TARGET SQL */%' ORDER BY s.sql_id
你可以使用snap_id从AWR中确定SQL的执行时间以及它的其他信息。