DBMS_SQLTUNE包失效处理

今天同事说Oracle报错,DBMS_SQLTUNE失效了,让帮忙看一下

检查包的状态,发现果然失效了。

SQL> SELECT 'Object_Status' "CHECK_NAME",owner,object_name,object_id,object_type,status from dba_objects
  2  where owner='SYS' and object_name = 'DBMS_SQLTUNE';

CHECK_NAME    OWNER                          OBJECT_NAME                                                    OBJECT_ID
------------- ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ----------
OBJECT_TYPE         STATUS
------------------- -------
Object_Status SYS                            DBMS_SQLTUNE                                                8558
PACKAGE             VALID

Object_Status SYS                            DBMS_SQLTUNE                                               11737
PACKAGE BODY        INVALID

手动编译仍然报错:

SQL> alter package sys.dbms_sqltune compile body;

Warning: Package Body altered with compilation errors.

就是决定重建包:

SQL> conn / as sysdba
SQL> @?/rdbms/admin/dbmssqlt.sql
SQL> @?/rdbms/admin/prvtsqlt.plb
SQL> @?/rdbms/admin/utlrp.sql

参考mos文档:DBMS_SQLTUNE Invalid after patching (Doc ID 2712246.1)

<think>嗯,用户问的是如何查看Oracle查询是否走了索引。我需要先回忆一下Oracle中相关的工具和方法。首先,执行计划是关键,对吧?常用的有EXPLAIN PLAN和DBMS_XPLAN。然后自动跟踪功能,比如SET AUTOTRACE ON。还有动态性能视图,比如V$SQL_PLAN。对了,还有SQL Monitor和索引监控视图V$OBJECT_USAGE。需要把这些步骤详细说明,让用户能一步步操作。 接下来,用户可能的场景是什么呢?可能是开发人员或者DBA,在优化查询性能,发现查询慢,怀疑没走索引。需要验证是否真的用了索引,或者索引是否有效。可能需要从简单的方法开始,比如使用执行计划,再介绍其他工具。 要注意用户可能不太熟悉这些工具,所以步骤要具体,比如如何运行EXPLAIN PLAN,如何查看结果。还有提醒他们权限的问题,比如使用AUTOTRACE需要权限。另外,索引失效的情况,比如函数导致索引失效,需要举例说明。还有组合索引的最左前缀原则,这也是常见的误区。 是否需要提到索引的选择性?比如即使走了索引,如果索引选择性差,可能效果不好。但用户的问题主要是确认是否走索引,所以可能暂时不需要深入。但可以稍微提一下,作为扩展建议。 另外,真实性的问题,比如确保统计信息是最新的,否则执行计划可能不准确。需要提醒用户如果怀疑统计信息过时,可以收集统计信息。比如用DBMS_STATS。 总结起来,步骤应该是: 1. 使用执行计划(EXPLAIN PLAN和DBMS_XPLAN) 2. 使用AUTOTRACE 3. 动态性能视图V$SQL_PLAN 4. SQL Monitor报告 5. 监控索引使用情况(V$OBJECT_USAGE) 6. 常见索引失效情况 需要检查是否有遗漏的方法,比如AWR报告中的SQL部分,但可能对新手来说复杂,暂时不提。或者使用SQL*Plus的自动跟踪,可能更简单。另外,要注意不同Oracle版本的差异,比如DBMS_XPLAN在9i之后的方式,但可能用户版本较新,所以按标准方法写。 最后,确保用中文,结构清晰,分步骤说明,每个步骤有示例代码,注意事项。避免使用专业术语不解释,比如执行计划是什么,可能需要简单说明。但用户可能已经有一定基础,所以可以适当使用术语,但保持解释简洁。</think>在Oracle数据库中,判断查询是否走索引可通过以下方法逐步分析: --- ### **一、查看执行计划(最直接方法)** #### 1. 使用 `EXPLAIN PLAN` ```sql -- 生成执行计划 EXPLAIN PLAN FOR SELECT * FROM employees WHERE employee_id = 100; -- 查看执行计划结果 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` **关键观察点**: - `INDEX` 开头的操作(如 `INDEX UNIQUE SCAN`、`INDEX RANGE SCAN`)表示走索引。 - `FULL TABLE SCAN` 表示全表扫描,未走索引。 #### 2. 使用 `DBMS_XPLAN` 直接查看 ```sql -- 直接获取最近执行SQL的计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR); ``` --- ### **二、使用自动跟踪功能** #### 1. 开启自动跟踪(需DBA权限) ```sql SET AUTOTRACE ON; SELECT * FROM employees WHERE employee_id = 100; ``` **输出解读**: - 在 `Execution Plan` 部分检查是否有索引扫描操作。 --- ### **三、动态性能视图查询** #### 1. 通过 `V$SQL_PLAN` 查看历史SQL计划 ```sql -- 查找SQL_ID SELECT sql_id, sql_text FROM v$sql WHERE sql_text LIKE '%SELECT * FROM employees%'; -- 根据SQL_ID查看执行计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('sql_id')); ``` --- ### **四、使用SQL Monitor报告(适用于长时间运行语句)** ```sql -- 生成实时监控报告 SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => 'your_sql_id') FROM DUAL; ``` --- ### **五、监控索引使用情况** #### 1. 开启索引监控(需DBA权限) ```sql ALTER INDEX employees_emp_id_idx MONITORING USAGE; ``` #### 2. 查看监控结果 ```sql SELECT * FROM v$object_usage WHERE index_name = 'EMPLOYEES_EMP_ID_IDX'; ``` - 若 `USED` 字段为 `YES`,表示索引被使用过。 --- ### **六、常见索引失效原因** 1. **隐式类型转换** ```sql -- 字段为VARCHAR2,但用数字查询 SELECT * FROM table WHERE char_column = 100; -- 索引失效 ``` 2. **函数操作字段** ```sql SELECT * FROM table WHERE UPPER(name) = 'JOHN'; -- 索引失效 ``` 3. **未满足最左前缀原则**(组合索引) ```sql -- 索引为 (col1, col2) SELECT * FROM table WHERE col2 = 100; -- 索引失效 ``` 4. **统计信息过时** ```sql -- 更新统计信息 EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLE_NAME'); ``` --- ### **总结步骤** 1. 通过执行计划确认是否走索引。 2. 检查索引失效的常见原因。 3. 必要时更新统计信息或重建索引: ```sql ALTER INDEX index_name REBUILD; ``` 通过以上方法,可系统化诊断Oracle查询是否有效使用索引,并根据结果进行针对性优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值