Oracle:过去30天内使用最多的10个索引

a8jjtwal  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(124)

我必须生成一个月度报告,我们必须看到前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以外的其他东西吗?
我尝试了上述方法,我假设它是正确的,虽然我没有什么可以比较我的结果,看看它是否真正正确。

4urapxun

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:

WITH AllIndexes AS (
SELECT
    i.owner,
    i.index_name,
    c.constraint_type
FROM
    dba_indexes i
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
    i.owner IN ('your_value_here')
)
SELECT
ai.owner,
ai.index_name,
ai.constraint_type,
COALESCE(num_executions, 0) AS num_executions
FROM
AllIndexes ai
LEFT JOIN (
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
) q ON ai.owner = q.owner AND ai.index_name = q.index_name AND     ai.constraint_type = q.constraint_type
ORDER BY
num_executions ASC
FETCH FIRST 100 ROWS ONLY;

相关问题