我必须生成一个月度报告,我们必须看到前10名最常用的索引和前10名最少使用的索引为我们的用户。
到目前为止,我写了这个:
SELECT
i.owner,
i.index_name,
c.constraint_type,
COUNT(*) AS num_executions
FROM
dba_hist_sqlstat s
JOIN
dba_hist_sql_plan p ON s.sql_id = p.sql_id AND s.plan_hash_value = p.plan_hash_value
JOIN
dba_indexes i ON p.object_owner = i.owner AND p.object_name = i.index_name
join
dba_hist_snapshot sp on sp.snap_id = s.snap_id
LEFT JOIN
dba_constraints c ON i.table_owner = c.owner AND i.table_name = c.table_name AND C.index_name = i.index_name
WHERE
s.elapsed_time_total > 0
and i.owner IN ('your_value_here')
AND sp.BEGIN_INTERVAL_TIME >= SYSDATE - 30
GROUP BY
i.owner, i.index_name,c.constraint_type
ORDER BY
num_executions asc
FETCH FIRST 10 ROWS ONLY;`
这是前10个最少使用的,所以我只需要改变num_executes desc的顺序。我的问题是,这是获得过去30天使用索引的方法吗?或者我必须使用开始_INTERVAL_TIME以外的其他东西吗?
我尝试了上述方法,我假设它是正确的,虽然我没有什么可以比较我的结果,看看它是否真正正确。
1条答案
按热度按时间4urapxun1#
这个问题在@Paul W和@Justin Cave的评论中得到了回答:
“least used”必须包括那些根本不使用的,所以你不能使用这个查询。您必须从dba_indexes开始,然后在嵌套块中外部连接到上面的查询,并按NVL(num_executions,0)排序以获得最少使用。至于“最后30天”,这就是你现在正在做的。使用dba_hist_snapshot的日期是在遇到这样的AWR数据时设置时间框架的正确方法。但是,如果使用RAC,请确保在联接中包含instance_number。- 保罗·W
首先,定义“最常用”和“最少使用”。您使用的定义似乎是基于使用索引的顶级SQL语句的执行次数。有许多可能的替代定义--例如,在索引段上执行的I/O量。如果你有一个执行嵌套循环的SQL语句,该语句可能有一次执行,但这一次执行将转换为10,000次索引查找。您当前的查询将其计数为1个索引使用,但另一个定义将其计数为10,000个索引使用。- 贾斯汀·凯夫
查询使用的最少索引数,包括0: