我在oracle中有一个表的索引,我不知道它是否被使用以及如何使用它。有没有办法记录使用该索引的所有语句?如果没有,是否有办法知道该索引是否被使用?
谢谢,
答案 0 :(得分:2)
了解最终目标肯定会有所帮助。
您可以查询GV$SQL_PLAN
表以查看共享池中哪些查询使用特定索引
SELECT *
FROM gv$sql_plan
WHERE object_owner = <<owner of object>
AND object_name = <<name of index>>
但是,根据您的系统,SQL语句可能不会长时间停留在共享池中,因此您可能需要相对频繁地进行轮询以确保不会遗漏任何内容。根据Oracle版本,版本和许可选项,您还可以查询AWR表以获取历史计划信息。但是,这只会包含有关在AWR快照中捕获的查询的信息。
SELECT *
FROM dba_hist_sql_plan
WHERE object_owner = <<owner of object>
AND object_name = <<name of index>>
如果您要完成的是确定是否正在使用索引,那么您可能希望使用类似index monitoring的内容,并让Oracle跟踪正在使用的索引。但请注意,这种方法存在缺陷。例如,有效删除所必需的indexes on foreign keys可能不会被标记为由索引监视使用(也不会仅通过查看查询计划来捕获它们)。尽管索引本身未被使用,索引监控也可能会错过statistics on an index are used提出有效计划的案例。