我有以下查询,该查询监视是否有人尝试与数据库中的技术用户登录:
SELECT COUNT (OS_USERNAME)
FROM DBA_AUDIT_SESSION
WHERE USERNAME IN ('USER1','USER2','USER3')
AND TIMESTAMP>=SYSDATE - 10/(24*60)
AND RETURNCODE !='0'
不幸的是,此SQL的性能相当差,因为它TABLE ACCESS FULL
在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;
而且情况甚至更糟。是否有可能通过强制oracle在此处使用索引来优化该查询?如果有任何帮助和提示,我将不胜感激。
SYS.AUD $没有任何默认索引,但是可以在上创建一个ntimestamp#
。
但是请谨慎操作。支持文档“在表Sys.Aud $上创建索引的影响(Doc ID 1329731.1)”包括以下警告:
不支持在SYS对象(包括表AUD $)上创建其他索引。
通常,这将是对话的结束,并且您想尝试另一种方法。但是在这种情况下,值得一试的原因有几个:
SESSIONID,SES$TID
(尽管我不知道为什么)。这些索引已经存在多年了,已经通过升级和修补程序完成了,据我所知,并没有引起任何问题。如果您愿意测试索引并接受少量风险,那么创建一个“不受支持的”索引可能是一个不错的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句