热门标签 | 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级别参数来使用不可见索引。



推荐阅读
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • andr ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
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社区 版权所有