对于返回当前会话中是否有任何活动事务的查询,
SELECT COUNT(*)
FROM
v$transaction t
INNER JOIN v$session s ON (t.ses_addr = s.saddr )
INNER JOIN v$mystat m ON (s.sid = m.sid )
WHERE ROWNUM = 1;
EXPLAIN
显示0成本。然而,事实似乎并非如此。在高负载环境中定期运行此查询会导致服务器浪费几乎所有资源。
估计此类查询影响的正确方法是什么(我相信同样的问题不仅发生在这个特定的查询上,而且发生在涉及系统视图的任何事情上)?
谢谢。
一些(全部?)动态
V$
视图不是基于字典表而是基于内存结构,因此不会收集传统统计信息,因此优化器无法计算这些视图的查询成本。但是,解释计划成本只是预期工作的粗略估计,因此它不应该是您评估查询效率的唯一方法。可以通过跟踪揭示查询的真实成本。跟踪您的实际查询和所有替代查询,tkprof 将揭示哪一个是最有效的。
特别是对于您的查询,您似乎想确定当前会话是否有未提交的工作。以下 SO 问题中描述了备用查询:
您能否尝试这些问题中的查询并告诉我们哪一个是最有效的(在您的高负载环境中)?