Oracle alter index disable/unusable的区别
近日,在处理DAO层oracle/mysql尽可能通用的问题,把DDL抽到了过程中,alter index disable的时候报了个错“ORA-02243: ALTER INDEX 或 ALTER MATERIALIZED VIEW 选项无效”,经查,原因是disable,enable针对函数索引。普通索引为unusable和rebuild。如下:
SQL> create table test as select * from all_objects; SQL> create index ind_t_object_id on test(object_id) nologging; SQL> exec dbms_stats.gather_table_stats(user,'test',cascade => true); SQL> set autotrace traceonly SQL> select * from test where object_id = 20; 执行计划 ---------------------------------------------------------- Plan hash value: 255872589 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 96 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 96 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_T_OBJECT_ID | 1 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_ID"=20) 统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 2 consistent gets 0 physical reads 0 redo size 910 bytes sent via SQL*Net to client 327 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed SQL> alter index ind_t_object_id disable; alter index ind_t_object_id disable * 第 1 行出现错误: ORA-02243: ALTER INDEX 或 ALTER MATERIALIZED VIEW 选项无效 SQL> alter index ind_t_object_id unusable; 索引已更改。 SQL> select * from test where object_id = 20; 执行计划 ---------------------------------------------------------- Plan hash value: 1357081020 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 96 | 168 (1)| 00:00:03 | |* 1 | TABLE ACCESS FULL| TEST | 1 | 96 | 168 (1)| 00:00:03 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("OBJECT_ID"=20) 统计信息 ---------------------------------------------------------- 237 recursive calls 0 db block gets 795 consistent gets 0 physical reads 0 redo size 910 bytes sent via SQL*Net to client 327 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 5 sorts (memory) 0 sorts (disk) 0 rows processed SQL> drop index ind_t_object_id; 索引已删除。 SQL> create index ind_t_object_id on test(to_char(object_id)) nologging; 索引已创建。 SQL> select * from test where to_char(object_id) = '20'; 执行计划 ---------------------------------------------------------- Plan hash value: 255872589 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 518 | 49728 | 24 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 518 | 49728 | 24 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_T_OBJECT_ID | 207 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(TO_CHAR("OBJECT_ID")='20') 统计信息 ---------------------------------------------------------- 24 recursive calls 0 db block gets 5 consistent gets 1 physical reads 0 redo size 910 bytes sent via SQL*Net to client 327 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed SQL> alter index ind_t_object_id disable; 索引已更改。 SQL> select * from test where to_char(object_id) = '20'; select * from test where to_char(object_id) = '20' * 第 1 行出现错误: ORA-30554: 基于函数的索引xx.xxx禁用
官方文档:
DISABLE Clause:
DISABLE applies only to a function-based index. This clause lets you disable the use of a function-based index. You might want to do so, for example, while working on the body of the function. Afterward you can either rebuild the index or specify another ALTER INDEX statement with the ENABLE keyword.
UNUSABLE Clause:
UNUSABLE Clause Specify UNUSABLE to mark the index or index partition(s) or index subpartition(s) UNUSABLE. An unusable index must be rebuilt, or dropped and re-created, before it can be used. While one partition is marked UNUSABLE, the other partitions of the index are still valid. You can execute statements that require the index if the statements do not access the unusable partition. You can also split or rename the unusable partition before rebuilding it.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-09-24 $ORACLE_HOME/rdbms/demo示例安装
2018-09-24 FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
2016-09-24 mysql max_allowed_packet过小导致的prepare失败