Oracle sys.aud $ / dba_audit_session监控 - 优化SQL性能

时间:2016-08-18 12:19:44

标签: oracle

我有以下查询监视是否有人尝试使用数据库上的技术用户登录:

TABLE ACCESS FULL

不幸的是,这个SQL的性能很差,因为它在sys.aud $上有SELECT COUNT (sessionid) FROM sys.aud$ WHERE userid IN ('USER1','USER2','USER3') AND ntimestamp# >=SYSDATE - 10/(24*60) AND RETURNCODE !='0' and action# between 100 and 102; 。我试图缩小它:

{{1}}

情况更糟。是否有可能通过强制oracle在此处使用索引来优化该查询?我将不胜感激任何帮助和提示。

3 个答案:

答案 0 :(得分:1)

SYS.AUD $没有任何默认索引,但可以在ntimestamp#上创建一个。

但请谨慎行事。支持文件"创建指数对表Sys.Aud $的影响(Doc ID 1329731.1)"包含此警告:

  

在SYS对象上创建附加索引,包括表AUD $,不受支持。

通常这将是对话的结束,你想尝试另一种方法。但在这种情况下,有几个理由值得一试:

  1. 该文件继续说索引可能会有所帮助,并先测试它。
  2. 它只是一个索引。 SYS模式很特殊,但我们仍然只是谈论表上的索引。它可能会减慢速度,或者可能导致空间错误,就像任何索引一样。但我怀疑它是否有可能做出一些疯狂的事情,比如造成错误的结果错误。
  3. 更改审计跟踪的表空间有点常见,因此表格并不神圣。
  4. 我之前看过它的索引。我管理的400个数据库中有2个在列SESSIONID,SES$TID上有一个索引(虽然我不知道为什么)。这些指数已存在多年,经过升级和修补,据我所知,还没有造成问题。
  5. 创建"不支持"如果您愿意对其进行测试并接受少量风险,那么索引对您来说可能是个不错的选择。

答案 1 :(得分:0)

如果您编写正确的连接,Oracle 10g以上的优化程序将为您的查询选择最佳计划。不确定DBA_AUDIT_SESSION中存在多少recocds,但您总是可以使用PARALLEL提示来加快执行速度。

SELECT /*+Parallel*/ COUNT (OS_USERNAME) 
--select COUNT (OS_USERNAME) 
FROM DBA_AUDIT_SESSION
WHERE USERNAME IN ('USER1','USER2','USER3') 
AND TIMESTAMP>=SYSDATE - 10/(24*60) 
AND RETURNCODE !='0'

查询成本比之前减少到3。

答案 2 :(得分:0)

NumRows:8080019

因公司规定,它非常大。不幸的是,在这里使用/*+Parallel*/会使其运行时间更长,因此性能仍然更差。

还有其他建议吗?