我有以下查询监视是否有人尝试使用数据库上的技术用户登录:
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在此处使用索引来优化该查询?我将不胜感激任何帮助和提示。
答案 0 :(得分:1)
SYS.AUD $没有任何默认索引,但可以在ntimestamp#
上创建一个。
但请谨慎行事。支持文件"创建指数对表Sys.Aud $的影响(Doc ID 1329731.1)"包含此警告:
在SYS对象上创建附加索引,包括表AUD $,不受支持。
通常这将是对话的结束,你想尝试另一种方法。但在这种情况下,有几个理由值得一试:
SESSIONID,SES$TID
上有一个索引(虽然我不知道为什么)。这些指数已存在多年,经过升级和修补,据我所知,还没有造成问题。创建"不支持"如果您愿意对其进行测试并接受少量风险,那么索引对您来说可能是个不错的选择。
答案 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*/
会使其运行时间更长,因此性能仍然更差。
还有其他建议吗?