Oracle 12c中在同一组列上创建多个索引
在数据库管理与优化领域,索引是提高查询性能的关键工具之一。然而,在某些情况下,单一类型的索引可能不足以满足所有查询的需求。Oracle 12c引入了一个强大的新特性:允许在同一组列上创建多个索引,但仅一个可见,并且每个索引需具有不同的属性。
本文将详细介绍如何利用这一特性进行更高效的数据库管理和优化。
一、非分区表
首先,我们从创建一个简单的非分区表开始:
DROP TABLE t1 PURGE;CREATE TABLE t1 (
id NUMBER,
description VARCHAR2(50),
created_date DATE
);INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (3, 't1 THREE', TO_DATE('01/07/2026', 'DD/MM/YYYY'));COMMIT;
接着,尝试创建两个索引来展示此功能:
- 创建一个普通可见索引:
CREATE INDEX t1_idx1 ON t1(created_date) VISIBLE;
- 尝试在同一列上创建一个不可见索引会导致错误(ORA-01408: such column list already indexed)。
CREATE INDEX t1_idx2 ON t1(created_date) INVISIBLE;*
ERROR at line 1:
ORA-01408: such column list already indexedSQL>
- 除非索引类型不同,如创建一个位图索引:
CREATE BITMAP INDEX t1_idx3 ON t1(created_date) INVISIBLE;
二、分区表示例
接下来,我们将探讨分区表的应用场景。首先创建一个基于created_date列的范围分区表:
DROP TABLE t1 PURGE;
CREATE TABLE t1 (
id NUMBER,
description VARCHAR2(50),
created_date DATE
)
PARTITION BY RANGE (created_date) (
PARTITION part_2024 VALUES LESS THAN (TO_DATE('01/01/2025', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION part_2025 VALUES LESS THAN (TO_DATE('01/01/2026', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION part_2026 VALUES LESS THAN (TO_DATE('01/01/2027', 'DD/MM/YYYY')) TABLESPACE users
);INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2024', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (3, 't1 THREE', TO_DATE('01/07/2026', 'DD/MM/YYYY'));
COMMIT;
然后,可以创建不同类型和配置的索引:
- 全局可见索引:
CREATE INDEX t1_idx1 ON t1(created_date) GLOBAL VISIBLE;
- 带有不同分区方案的全局不可见索引:
CREATE INDEX t1_idx2 ON t1(created_date) GLOBAL
PARTITION BY RANGE (created_date) (
PARTITION t1_p1 VALUES LESS THAN (TO_DATE('01/01/2025', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION t1_p2 VALUES LESS THAN (TO_DATE('01/01/2026', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION t1_p3 VALUES LESS THAN (MAXVALUE) TABLESPACE users
)
INVISIBLE;
- 局部不可见索引:
CREATE INDEX t1_idx3 ON t1(created_date) LOCAL INVISIBLE;
以上方法均可以在created_date列成功创建索引,但类型必须为INVISIBLE。
三、为什么使用多个索引?
即使不可见,索引仍然会被维护。因此,在同一组列上拥有多个索引使您可以快速切换它们,从而更快地测试各种索引的影响。请记住,过多的索引会对表的DML性能产生影响,因此不建议在同一个列上创建多个索引。
下面的例子使用了上述创建的分区表和相关索引来检查索引的可见性:
-- 检查索引的可见性 .
COLUMN index_name FORMAT A10
COLUMN index_type FORMAT A10
COLUMN partitioned FORMAT A12
COLUMN locality FORMAT A8
COLUMN visibility FORMAT A10SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1 NORMAL NO VISIBLE
T1_IDX2 NORMAL YES RANGE GLOBAL INVISIBLE
T1_IDX3 NORMAL YES RANGE LOCAL INVISIBLE
T1_IDX4 BITMAP YES RANGE LOCAL INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 1 (0)| 00:00:01 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1 | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
|* 2 | INDEX RANGE SCAN | T1_IDX1 | 1 | | 1 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF
切换索引可见性,然后再次测试。
-- 切换索引.
ALTER INDEX t1_idx1 INVISIBLE;
ALTER INDEX t1_idx2 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1 NORMAL NO INVISIBLE
T1_IDX2 NORMAL YES RANGE GLOBAL VISIBLE
T1_IDX3 NORMAL YES RANGE LOCAL INVISIBLE
T1_IDX4 BITMAP YES RANGE LOCAL INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 1 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1 | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | T1_IDX2 | 1 | | 1 (0)| 00:00:01 | 1 | 1 |
-----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF
再次切换索引可见性并测试。
-- 切换索引.
ALTER INDEX t1_idx2 INVISIBLE;
ALTER INDEX t1_idx3 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1 NORMAL NO INVISIBLE
T1_IDX2 NORMAL YES RANGE GLOBAL INVISIBLE
T1_IDX3 NORMAL YES RANGE LOCAL VISIBLE
T1_IDX4 BITMAP YES RANGE LOCAL INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 1 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1 | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | T1_IDX3 | 1 | | 1 (0)| 00:00:01 | 1 | 1 |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF
再次切换索引可见性并测试。
-- 切换索引.
ALTER INDEX t1_idx3 INVISIBLE;
ALTER INDEX t1_idx4 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1 NORMAL NO INVISIBLE
T1_IDX2 NORMAL YES RANGE GLOBAL INVISIBLE
T1_IDX3 NORMAL YES RANGE LOCAL INVISIBLE
T1_IDX4 BITMAP YES RANGE LOCAL VISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 15 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 49 | 15 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1 | 1 | 49 | 15 (0)| 00:00:01 | 1 | 1 |
| 3 | BITMAP CONVERSION TO ROWIDS | | | | | | | |
|* 4 | BITMAP INDEX SINGLE VALUE | T1_IDX4 | | | | | 1 | 1 |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF
通过以上的测试流程,我们可以得到同一个列上不同类型的索引的执行计划以及消耗情况,这样可以筛选出最为适合的索引创建方案。
四、使用不可见索引
通过设置参数OPTIMIZER_USE_INVISIBLE_INDEXES为TRUE,可以启用对不可见索引的支持,从而测试不同索引策略的效果:
ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;
这使得即使存在可见索引,也可以选择使用不可见索引,为数据库管理员提供了更大的灵活性来优化查询性能。
-- 检查索引的可见性 .
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- -------- ----------
PK_EMP NORMAL NO VISIBLE
T1_IDX1 NORMAL NO INVISIBLE
T1_IDX2 NORMAL YES RANGE GLOBAL INVISIBLE
T1_IDX3 NORMAL YES RANGE LOCAL INVISIBLE
T1_IDX4 BITMAP YES RANGE LOCAL VISIBLESQL>-- 允许优化器使用不可见索引.
ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;SET AUTOTRACE TRACE EXPLAINSELECT *
FROM t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 1 (0)| 00:00:01 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1 | 1 | 49 | 1 (0)| 00:00:01 | 1 | 1 |
|* 2 | INDEX RANGE SCAN | T1_IDX1 | 1 | | 1 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF
五、结论
Oracle 12c提供的在同一组列上创建多个索引的功能极大地增强了数据库管理员调整和优化数据库的能力。通过合理配置不同类型的索引,可以有效地提升查询效率,同时保持系统的灵活性和可维护性。
相关文章:
Oracle 12c中在同一组列上创建多个索引
在数据库管理与优化领域,索引是提高查询性能的关键工具之一。然而,在某些情况下,单一类型的索引可能不足以满足所有查询的需求。Oracle 12c引入了一个强大的新特性:允许在同一组列上创建多个索引,但仅一个可见…...
线程安全的集合类
文章目录 多线程环境使⽤`ArrayList`线程不安全线程安全可以使用 `ReentrantLock` 或 `synchronized`来保护 `ArrayList` 的访问。使用同步包装器使用 `CopyOnWriteArrayList`**“写时复制”机制**多线程环境使⽤队列多线程环境使⽤哈希表HashtableConcurrentHashMapHashMap、H…...
【如何实现 JavaScript 的防抖和节流?】
如何实现 JavaScript 的防抖和节流? 前言 防抖(Debounce)和节流(Throttle)是 JavaScript 中优化高频事件处理的两种常用技术。它们可以有效减少事件处理函数的调用次数,提升性能并改善用户体验。本文将详…...
C#中File类的Copy()方法或FileInfo类的CopyTo()方法的参数overwrite取false和true的区别
当调用 System.IO.File.Copy 方法时,第三个参数 overwrite 控制着如果目标位置已经存在同名文件的情况下如何处理。 1、当 overwrite 设置为 true 在这种情况下,即使目标路径下已经有相同名称的文件,该方法也会无条件地覆盖现有的文件。这不…...
力扣 买卖股票的最佳时机
贪心算法典型例题。 题目 做过股票交易的都知道,想获取最大利润,就得从最低点买入,最高点卖出。这题刚好可以用暴力,一个数组中找到最大的数跟最小的数,然后注意一下最小的数在最大的数前面即可。从一个数组中选两个数…...
蚁剑(AutSword)的下载安装与报错解决
蚁剑(AutSword)的下载安装与报错解决 1.下载 唯一官方github下载地址 GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 2.安装 打开并且进入到下面的界面 下载需要的的版本 进行初始化 3.报错 出现下面的报错 4.解决方法 出现上面报错…...
【全栈开发】----Mysql基本配置与使用
本篇是在已下载Mysql的情况下进行的,若还未下载或未创建Mysql服务,请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…...
Spring Boot项目的基本设计步骤和相关要点介绍
以下是一个关于Spring Boot项目的基本设计步骤和相关要点介绍,我们以一个简单的示例应用——员工管理系统为例进行说明: 一、项目概述 员工管理系统旨在实现对公司员工信息的有效管理,包括员工基本信息录入、查询、更新以及删除等功能。通过Spring Boot框架来快速搭建后端…...
【Spring快速入门】不断更新...
一、Java基础 1、注解 1.3、自定义注解 springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)_springboot在类或者方法上加自定义注解-CSDN博客 同平台的新林。大佬就总结的很好,最近写得项目利用aop切面编程中的Aut…...
nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作
要删除 Node.js 的某个版本并保持 Node Version Manager (nvm) 的管理整洁,可以按以下步骤操作: 步骤 1:查看已安装的 Node.js 版本 nvm ls这会列出你通过 nvm 安装的所有 Node.js 版本。输出类似于: -> v18.17.1v16.20…...
HTML之JavaScript DOM(document)编程处理事件
HTML之JavaScript DOM(document)编程处理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...
5.【线性代数】—— 转置,置换和向量空间
五 转置,置换和向量空间 1. 置换矩阵2. 转置矩阵3. 对称矩阵4. 向量空间4.1 向量空间4.2 子空间 1. 置换矩阵 定义: 用于行互换的矩阵P。 之前进行ALU分解时,可能存在该行主元为0,要进行行互换,即PALU 性质࿱…...
移动通信发展史
概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通:成立于 2000 年…...
Python MoviePy 视频处理全攻略:从入门到实战案例
第1章 环境安装与配置 # 案例1:安装MoviePy及FFmpeg !pip install moviepy # Windows安装FFmpeg:https://ffmpeg.org/download.html # Linux: sudo apt-get install ffmpeg# 验证安装 from moviepy.editor import * print("MoviePy版本:", __…...
uniapp webview嵌入外部h5网页后的消息通知
最近开发了个oa系统,pc端的表单使用form-create开发,form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发,但是因为form-create移动端只支持vant,不支持uniapp。官…...
macos安装jmeter测试软件
java环境安装 a. 验证安装环境 java -version # 如果有版本信息,说明已安装 b. 安装jdk # 安装 Homebrew(如未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装 O…...
【virtiofs】ubuntu24.04+qemu7.0调试virtiofs
文章目录 编译qemu编译buildroot编译linux-6.8.1编译virtiofsd启动脚本qemu调试方法环境: win11 + vmware17 ubuntu24.04 buildroot git clone git://git.busybox.net/buildroot linux-6.8.1 https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.8.1.tar.gz virti…...
DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
MoE硬件部署
文章目录 MoE硬件部署硬件需求**专家硬件映射:模块化计算单元****路由硬件加速:门控网络专用单元****内存与通信优化****能效控制策略****实例:假设部署Mixtral 8x7B到自研AI芯片** 资源分配硬件资源预分配(编译时)运行…...
MYSQL中的性能调优方法
MySQL性能调优是数据库管理的重要工作之一,目的是通过调整系统配置、优化查询语句、合理设计数据库架构等方法,提高数据库的响应速度和处理能力。以下是常见的MySQL性能调优方法,结合具体的案例进行说明。 1. 优化查询语句 查询语句是数据库…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
