热门标签 | 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 Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
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社区 版权所有