当前位置: 首页 > news >正文

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引?

全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。

二.实验

CREATE TABLE test (TEST_ID   NUMBER(6),TEST_NAME VARCHAR2(50),TEST_DESC VARCHAR2(4000)
);
BEGINFOR i IN 1..10000 LOOPINSERT INTO test (TEST_ID,TEST_NAME,TEST_DESC) VALUES (i, 'Product ' || i, DBMS_RANDOM.STRING('A', 2000));END LOOP;COMMIT;
END;
/

 创建一个普通索引

create index idx_test on test(test_desc);

查看执行计划,检查索引是否生效

 select * from test where test_desc like 'LRbwu%';

061a05344b9145c3aed953780b82ae2d.png

 到此,是没有任何问题的,在这种情况中,我们知道test_id 是以什么字符开头的


 

那么就会有这么一种情况,我们不知道这个内容开头是什么,只知道中间是什么,有什么关键字,那么这种情况 我们就需要<%内容%>,那么这种情况还会走索引吗?

select * from test where test_desc like '%AoaUR%';

ac80bd1246904582b226ddb63d6c4d1d.png

 这时候我们发现,走了全表扫描,所以普通的索引解决不了我们只知道关键字,而不知道以什么字符开头的情况。

这也可以理解,B Tree索引只顺序存储了表中列值以及对应的rowid,并且对于索引中字符串的排序,是根据该字符串第一个字符的ASCⅡ码,第一个字符的ASCⅡ码相同,再解析第二个。在这种情况中,我们不知道字符串前面的字符是什么,所以B Tree索引无法使用。

所以这种场景就需要我们今天介绍的内容-全文索引


三.使用全文索引

 

在使用之前,数据库中必须要系统用户CTXSYS,如果没有则有两种方式来配置

1.dbca配置数据库,这里不做演示,配置后产生了CTXSYS用户

35e5cef47d7d4cee81e0a23778356236.png

2.跑脚本

/u01/app/oracle/product/19.3.0/dbhome_1/ctx/admin
ls -al catctx.sql

在数据库中跑这个脚本就好。

 

创建全文索引

确认已存在的段

col segment_name for a30
col object_name for a30
select segment_name ,segment_type from user_segments;

18c8fe4c4b9f4758b598d29d9a136c59.png

create index idx_ctx_test on test(test_desc) indextype is ctxsys.context;

79f29b61496343dabbe29b90861f54a3.png

这里我们发现,全文索引可以建立在普通索引之上,意思是表中的一列有索引了,仍然可以建立全文索引,说明全文索引的结构和普通索引的结构肯定是有区别的。

select * from test where contains(test_desc,'LRbwu') > 0;

5840c208c7944980b1ff628c353754c0.png

 可以看到sql语句走了全文索引。

再查看一下现在的段都有哪些

col segment_name for a30
col object_name for a30
select segment_name ,segment_type from user_segments;

ce955e6cdc84465ebae3d7bab9d4aa77.png

可以看到段多了很多TEST是基本表,剩下的除了IDX_TEST是普通索引,剩下的全是全文索引,

但是我们刚才创建的索引名字是idx_ctx_test,发现找不到,这是因为全文索引只是逻辑上的概念,他没有存储对象,它的实现都依赖这些表。

 

四.深入全文索引

我们来看看这几张表

1e07b6d7c46544c7806c959be3d0de39.png

出现的token给他编一个号,并且存储了重复出现的次数(TOKEN_COUNT)

我们随机搜索一个字符串。

2319e2aea0084f00b5d547bdcbbd2064.png

DR$IDX_CTX_TEST$I 这个表把test_desc 这一列的值像字典一样保存出来,编一个号,并且总结出现的次数。但由于我是使用的DBMS_RANDOM.STRING 这个包随机创建的数据,所以这个表非常的大。

编了号之后,仍然不知道这些词在哪个地方,这时候就需要另外一张表 DR$IDX_CTX_TEST$K

 061f0c48b5ac49fd8f61057c3842dca2.png

 55ccc6164b164605961a78c0b5a377ac.png

这个TEXTKEY就是rowid了,我们可以根据TESTKEY找到数据了.

也就是说 DR$IDX_CTX_TEST$I  会生成token和编号,DR$IDX_CTX_TEST$K 表示对应的这些编号数据存放在哪里

349b900f0b8d4d32a0988cba26cb3a0f.png

 

五.全文索引的维护

在TEST表上做DML操作,看索引与表是否同步4

1.insert

select * from test where test_desc like 'nihao';

c17d31deb2dd4b3eacd19f38a266ff65.png

insert into test values (999,'DBA','nihao');

 57a8bb0f56494de481e3410bec2a41fe.png

此时通过全文索引查找数据,查看是否更新  

select * from test where contains(test_desc,'nihao') > 0;

61ecbbb87f594490bd3f358f1ae1d998.png

发现全文索引没有更新,这就说明表中的数据变了,而全文索引中的数据没有变。

使用sys查看ctxsys.dR$pending表

select * from ctxsys.dR$pending;

3e55b96f11ac4a4286fd341e417546c1.png

 这个表里面的数据就是我刚才插入的数据,只是没有更新到全文索引

这种情况需要重建全文索引。

alter index idx_ctx_test rebuild;

再次使用全文索引查询发现更新了

56038c07225c41388b76df26546a237a.png

 

2.delete

941e56c3006a4c9d8913960d25a5387b.png

 查看全文索引

f626768693ec4680b29b0cef28065f48.png

 这里可以发现,delete与insert语句不同,delete后 全文索引也更新了。

3.update,可以自己做实验,update也是不同步全文索引的。

 

六.全文索引创建同步的方式

一遇到插入的场景就需要重建全文索引,这也太麻烦了,所以,我们可以在创建全局索引的时候指定同步的方式。

提交时同步

create index idx_ctx_test on test(test_desc) indextype is ctxsys.context parameters('sync (on commit)');

 指定时间同步(建议)

需要给用户 job的权限

grant create job to user1;

 8ae23f100a2344e788b757590364bf8e.png

 例如:每天晚上两点来同步全文索引

create index idx_ctx_test on test(test_desc) indextype is ctxsys.context parameters ('sync (every "trunc(sysdate) + 2/24")');

20d45be2dddd40afa57e2bbeaf2fd8cd.png

 

 

 

 

 

相关文章:

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引&#xff1f; 全文索引通过分析和处理文本&#xff0c;将文档中的单词分解为词条&#xff08;tokens&#xff09;&#xff0c;然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录&#xff0c;而不必对所有文本逐字匹配。 二…...

GoogleChrome和Edge浏览器闪屏问题

GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…...

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中&#xff0c;这样…...

Go性能基础

本篇内容是根据2020年2月份#117 Foundations of Go performance音频录制内容的整理与翻译 在这个多部分系列的第一部分中&#xff0c;Ian 和 Johnny 以及 Miriah Peterson 和 Bryan Boreham 一起揭开了 Go 程序性能的第一层重要内容。 过程中为符合中文惯用表达有适当删改, 版…...

银河麒麟v10安装Anaconda(python大蟒蛇)+pycharm安装

Anaconda中文是大蟒蛇&#xff0c;是一个用于科学计算的Python发行版&#xff0c;预装大量的模块包&#xff0c;不需要单独下载python进行安装 1安装环境 1.1系统版本 操作系统版本&#xff1a;银河麒麟桌面版操作系统v10(SP1) 版本号&#xff1a;2303 架构&#xff1a;x86…...

集群聊天服务器——逻辑梳理

网络聊天服务器项目&#xff0c;该项目分为4个模块&#xff1a; 首先是网络模块&#xff1a;我使用了muduo高性能网络库&#xff0c;解耦合网络与业务之间这两部分代码&#xff0c;可以更加专注与业务的功能开发其次是服务层模块&#xff1a;我使用了基于C11的技术比如绑定器和…...

10 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒24_10_30

这里写目录标题 cpp 101 最长回文子串1.1 题目1.2 思路1.3 程序实现 2 买卖股票的最好时机(一)2.1 题目2.2 思路2.3 程序实现2.4 程序实现 – 优化 3 [NOIP2002 普及组] 过河卒3.1题目3.2 思路3.3程序实现 – dp 4 题目链接 cpp 10 1 最长回文子串 1.1 题目 1.2 思路 读完了…...

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…...

一文理解决策树:原理、数学公式与全流程实战讲解

一、背景与来源 决策树&#xff08;Decision Tree&#xff09;是一种常见的机器学习算法&#xff0c;主要用于分类和回归问题。其概念来源于统计学和决策论&#xff0c;能够直观地模拟人类的决策过程。最早的决策树算法之一是 1963 年由 Hunt 等人提出的&#xff0c;该算法逐渐…...

day04-LogStash扩展

1.LogStash性能不稳定&#xff08;某天关闭后&#xff0c;再次启动就非常慢&#xff09;&#xff0c;所以后面我们用Filebeat。2.先禁用 # geoip { # source > "clientip" # }3.在生产中要是用nignx服务或tomcat服务我们用EFK架构就可以排查技巧观察点 LogS…...

Linux云计算 |【第五阶段】CLOUD-DAY4

主要内容&#xff1a; Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用 一、容器介绍 容器&#xff08;Container&#xff09; 是一种轻量级的虚拟化技术&#xff0c;用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应…...

为什么QNAP威联通NAS的APP center无法安装APP?

创作立场&#xff1a;原创不易&#xff0c;拒绝搬运~ hello大家好&#xff0c;我是你们的老伙伴&#xff0c;稳重的大王~ 如题&#xff0c;大王带你一起来排查一下&#xff0c;可能遇到的问题。如有帮助&#xff0c;请给个关注鼓励&#xff0c;互谢~ 1 首先&#xff0c;安装…...

Kafka 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …...

网络问题排查

1.ping 域名发现响应时间很长&#xff0c;怎么分析卡在哪里&#xff1f; 当你在 Linux 系统中 ping 一个域名并发现响应时间很长时&#xff0c;可能存在于多个环节的问题。以下是一些步骤和工具&#xff0c;可以帮助你分析和诊断问题出在哪里&#xff1a; 1. 检查 DNS 解析时…...

webGlL变量的声明与使用

抢先观看&#xff1a; 变量的声明格式&#xff1a;<存储限定符><类型限定符><变量名> 存储限定符&#xff1a;const, attribute, uniform, varying, buffer。 类型限定符&#xff1a;void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…...

qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频

QT c 环境配置和c基础 c环境配置和工程创建  1.配置步骤  2.新建qt 工程目录和工程  3.重启qt后打开最近的qt项目 c基础-类和对象  1.什么是类和对象    A.类的定义    B.类的结构表示    C.类的访问权限    D.对象的定义    E.类和对象的关系 2.类…...

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…...

唱戏机上的内存卡怎么加密?教你两个方法

唱戏机是中老年人群休闲时光的好伴侣。然而&#xff0c;很多唱戏机商家都会面临一个困扰&#xff1a;如何保护唱戏机上内存卡中的音频&#xff0c;避免他人随意复制呢&#xff1f;今天这篇文章看完&#xff0c;问题将迎刃而解~ 数据隐藏 将内存卡插到电脑上&#xff0c;对卡里…...

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler

MyBatis的SQL执行过程 在前面一系列的文档中&#xff0c;我已经分析了 MyBatis 的基础支持层以及整个的初始化过程&#xff0c;此时 MyBatis 已经处于就绪状态了&#xff0c;等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程&#xff0c;该过程比较复杂&#xff…...

webpack解决使用window.open方法打开history路由页面提示404的问题

问题: 一般情况下应该使用history.push(/ssh)打开history路由页面 但项目中使用window.open(/ssh),然后使用new WebSocket进行通信 开发环境下启动项目后,/ssh页面打开却显示cannot get /ssh,控制台提示404 排查问题: 在React开发环境中使用 window.open 打开路由页面时&a…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...