热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle使索引不可见,关于oracle的不可见索引探究

--FDH一、关于oracle的不可见索引oracle对于不可见索引的给出的官方定义是:AninvisibleindexismaintainedbyDMLoperat

--FDH

一、关于oracle的不可见索引

oracle对于不可见索引的给出的官方定义是:

An invisible indexis maintained by

DML operations and is not used by default by the optimizer. Making an index

invisible is an alternative to making it unusable or dropping it. Invisible

indexes are especially useful for testing the removal of an index before

dropping it or using indexes temporarily without affecting the overall

application.

大致翻译为:

不可见索引在 DML 操作中会被维护,但在默认情况下优化器不会使用它。使索引不可见是使其不可用或删除它的一种替代方法。不可见索引有时特别有用,比如在删除索引前测试移除后果,或临时用一下索引而不会影响整个应用程序。

二、关于oracle不可见索引的实验

2.1创建表和索引:

创建表

T_test_index:

create table T_test_index (id number,name varchar2(40),bz varchar2(50));

添加数据:

begin

for c in 1 .. 10000 loop

insert into T_test_index values (c, 'fdh', '');

end loop;

end;

创建正常索引I_T_TEST_INDEX_ID:

create index I_T_TEST_INDEX_ID on T_test_index(id);

收集统计信息:

begin

dbms_stats.gather_table_stats('scott', 'T_TEST_INDEX', cascade => true);

end;

查看索引的状态和是否可见:

bd11236616215b79b600af785b83eb07.png

查看谓词带有ID列的执行计划:

564c0aaee90401facab27241795fc0cd.png

2.2将索引设为不可见:

alter index I_T_TEST_INDEX_ID invisible;

查看是否修改成功:

54fdae1351990f2e3ddf46ff9298e044.png

查看谓词带有ID列的执行计划:

d995dca2247d5b8b9d9926c7e88da4eb.png

果然将索引I_T_TEST_INDEX_ID 设置为不可见之后,优化器不会再考虑索引的扫描。

好了,到这里有一个问题,如果在SQL上面添加强制使用该不可见索引的HNIT,那么优化器是否会选择索引呢?下面我们再SQL语句中添加强制索引HNIT:

c404373b4eeaaf0f26838cbbdf1b2ed6.png

很显然优化器还是没有使用索引,依然还是全表扫描。所以当索引不可见时,即使hnit也无法改变使优化器使用该索引。

2.3使用不可见索引的方法:

修改session的参数:

alter session set

optimizer_use_invisible_indexes = true;

修改之后再该session上的运行上述同样的SQL的执行计划变更为:

a077be01f16fb34ac63f29129b84f404.png

所以当索引被设为不可见时,并非完全不可用。

可以通过修改参数optimizer_use_invisible_indexes为true来使用(默认为false,system级别和session级别都可以修改)

三、总结

1、当索引变更为不可见的时候,只是对oracle的优化器不可见。

2、不可见索引在DML操作的时候也会被维护。

3、加HNIT对不可见索引无效。

4、可以通过修改system级别和session级别参数来使用不可见索引。



推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
author-avatar
捕鱼达人2502868831
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有