如何查找 Oracle 中性能较差的 SQL 查询?
Oracle 维护共享 SQL 区域的统计数据,每个 SQL 字符串(v$sqlarea)包含一行。 但是,我们如何才能确定哪些查询性能较差?
我发现这条 SQL 语句是一个有用的起点(抱歉我无法将其归属于原作者;我是在互联网上找到的):
SELECT * FROM
(SELECT
sql_fulltext,
sql_id,
elapsed_time,
child_number,
disk_reads,
executions,
first_load_time,
last_load_time
FROM v$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10
/
这样就能找到当前存储在 SQL 缓存中的最重要 SQL 语句,这些语句按已用时间排序。 随着时间的推移,语句会从缓存中消失,因此,当你中午上班时,再试图诊断昨晚的批处理工作可能就没有用了。
您还可以尝试按磁盘读数和执行次数排序。 执行次数很有用,因为有些糟糕的应用程序会发送相同的 SQL 语句太多次。 该 SQL 假设你正确使用了绑定变量。
然后,你可以将语句中的 sql_id
和 child_number
输入到这个宝贝中: -
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', &child));
这将显示 SQL 缓存中的实际计划和 SQL 全文。
在搜索过程中,我得到了以下查询结果,只需一个假设就能完成工作(查询执行时间为 6 秒)
SELECT username, sql_text, sofar, totalwork, units
FROM v$sql,v$session_longops
WHERE sql_address = address AND sql_hash_value = hash_value
ORDER BY address, hash_value, child_number;
我认为上述查询将列出当前用户的详细信息。
欢迎提出意见