文本列的性能优化?深入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%';

到此,是没有任何问题的,在这种情况中,我们知道test_id 是以什么字符开头的
那么就会有这么一种情况,我们不知道这个内容开头是什么,只知道中间是什么,有什么关键字,那么这种情况 我们就需要<%内容%>,那么这种情况还会走索引吗?
select * from test where test_desc like '%AoaUR%';

这时候我们发现,走了全表扫描,所以普通的索引解决不了我们只知道关键字,而不知道以什么字符开头的情况。
这也可以理解,B Tree索引只顺序存储了表中列值以及对应的rowid,并且对于索引中字符串的排序,是根据该字符串第一个字符的ASCⅡ码,第一个字符的ASCⅡ码相同,再解析第二个。在这种情况中,我们不知道字符串前面的字符是什么,所以B Tree索引无法使用。
所以这种场景就需要我们今天介绍的内容-全文索引
三.使用全文索引
在使用之前,数据库中必须要系统用户CTXSYS,如果没有则有两种方式来配置
1.dbca配置数据库,这里不做演示,配置后产生了CTXSYS用户

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;

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

这里我们发现,全文索引可以建立在普通索引之上,意思是表中的一列有索引了,仍然可以建立全文索引,说明全文索引的结构和普通索引的结构肯定是有区别的。
select * from test where contains(test_desc,'LRbwu') > 0;

可以看到sql语句走了全文索引。
再查看一下现在的段都有哪些
col segment_name for a30
col object_name for a30
select segment_name ,segment_type from user_segments;

可以看到段多了很多TEST是基本表,剩下的除了IDX_TEST是普通索引,剩下的全是全文索引,
但是我们刚才创建的索引名字是idx_ctx_test,发现找不到,这是因为全文索引只是逻辑上的概念,他没有存储对象,它的实现都依赖这些表。
四.深入全文索引
我们来看看这几张表

出现的token给他编一个号,并且存储了重复出现的次数(TOKEN_COUNT)
我们随机搜索一个字符串。

DR$IDX_CTX_TEST$I 这个表把test_desc 这一列的值像字典一样保存出来,编一个号,并且总结出现的次数。但由于我是使用的DBMS_RANDOM.STRING 这个包随机创建的数据,所以这个表非常的大。
编了号之后,仍然不知道这些词在哪个地方,这时候就需要另外一张表 DR$IDX_CTX_TEST$K


这个TEXTKEY就是rowid了,我们可以根据TESTKEY找到数据了.
也就是说 DR$IDX_CTX_TEST$I 会生成token和编号,DR$IDX_CTX_TEST$K 表示对应的这些编号数据存放在哪里

五.全文索引的维护
在TEST表上做DML操作,看索引与表是否同步4
1.insert
select * from test where test_desc like 'nihao';

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

此时通过全文索引查找数据,查看是否更新
select * from test where contains(test_desc,'nihao') > 0;

发现全文索引没有更新,这就说明表中的数据变了,而全文索引中的数据没有变。
使用sys查看ctxsys.dR$pending表
select * from ctxsys.dR$pending;

这个表里面的数据就是我刚才插入的数据,只是没有更新到全文索引
这种情况需要重建全文索引。
alter index idx_ctx_test rebuild;
再次使用全文索引查询发现更新了

2.delete

查看全文索引

这里可以发现,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;

例如:每天晚上两点来同步全文索引
create index idx_ctx_test on test(test_desc) indextype is ctxsys.context parameters ('sync (every "trunc(sysdate) + 2/24")');

相关文章:
文本列的性能优化?深入Oracle全文索引
一.什么是全文索引? 全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。 二…...
GoogleChrome和Edge浏览器闪屏问题
GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…...
【设计模式系列】迭代器模式(七)
一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样…...
Go性能基础
本篇内容是根据2020年2月份#117 Foundations of Go performance音频录制内容的整理与翻译 在这个多部分系列的第一部分中,Ian 和 Johnny 以及 Miriah Peterson 和 Bryan Boreham 一起揭开了 Go 程序性能的第一层重要内容。 过程中为符合中文惯用表达有适当删改, 版…...
银河麒麟v10安装Anaconda(python大蟒蛇)+pycharm安装
Anaconda中文是大蟒蛇,是一个用于科学计算的Python发行版,预装大量的模块包,不需要单独下载python进行安装 1安装环境 1.1系统版本 操作系统版本:银河麒麟桌面版操作系统v10(SP1) 版本号:2303 架构:x86…...
集群聊天服务器——逻辑梳理
网络聊天服务器项目,该项目分为4个模块: 首先是网络模块:我使用了muduo高性能网络库,解耦合网络与业务之间这两部分代码,可以更加专注与业务的功能开发其次是服务层模块:我使用了基于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开发中,Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用,尤其是在高并发和UI性能优化中,可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…...
一文理解决策树:原理、数学公式与全流程实战讲解
一、背景与来源 决策树(Decision Tree)是一种常见的机器学习算法,主要用于分类和回归问题。其概念来源于统计学和决策论,能够直观地模拟人类的决策过程。最早的决策树算法之一是 1963 年由 Hunt 等人提出的,该算法逐渐…...
day04-LogStash扩展
1.LogStash性能不稳定(某天关闭后,再次启动就非常慢),所以后面我们用Filebeat。2.先禁用 # geoip { # source > "clientip" # }3.在生产中要是用nignx服务或tomcat服务我们用EFK架构就可以排查技巧观察点 LogS…...
Linux云计算 |【第五阶段】CLOUD-DAY4
主要内容: Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用 一、容器介绍 容器(Container) 是一种轻量级的虚拟化技术,用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应…...
为什么QNAP威联通NAS的APP center无法安装APP?
创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 如题,大王带你一起来排查一下,可能遇到的问题。如有帮助,请给个关注鼓励,互谢~ 1 首先,安装…...
Kafka 基础入门
文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 前言 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 域名发现响应时间很长,怎么分析卡在哪里? 当你在 Linux 系统中 ping 一个域名并发现响应时间很长时,可能存在于多个环节的问题。以下是一些步骤和工具,可以帮助你分析和诊断问题出在哪里: 1. 检查 DNS 解析时…...
webGlL变量的声明与使用
抢先观看: 变量的声明格式:<存储限定符><类型限定符><变量名> 存储限定符:const, attribute, uniform, varying, buffer。 类型限定符: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.类…...
中间件安全(三)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞(cve_2021_41773)。 靶场链接:Vulfocus 漏洞威胁分析平台 一,漏洞简介。 cve_2021_41773漏洞…...
唱戏机上的内存卡怎么加密?教你两个方法
唱戏机是中老年人群休闲时光的好伴侣。然而,很多唱戏机商家都会面临一个困扰:如何保护唱戏机上内存卡中的音频,避免他人随意复制呢?今天这篇文章看完,问题将迎刃而解~ 数据隐藏 将内存卡插到电脑上,对卡里…...
MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler
MyBatis的SQL执行过程 在前面一系列的文档中,我已经分析了 MyBatis 的基础支持层以及整个的初始化过程,此时 MyBatis 已经处于就绪状态了,等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程,该过程比较复杂ÿ…...
webpack解决使用window.open方法打开history路由页面提示404的问题
问题: 一般情况下应该使用history.push(/ssh)打开history路由页面 但项目中使用window.open(/ssh),然后使用new WebSocket进行通信 开发环境下启动项目后,/ssh页面打开却显示cannot get /ssh,控制台提示404 排查问题: 在React开发环境中使用 window.open 打开路由页面时&a…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
