问题描述
嗨,汤姆,
例如,我有一个表,其中将有数百万条记录。
FULL_TEXT_SEARCH是我在其中连接了EMPLOYEE_NUMBER,FIRSTNAME和CITY_NAME的列。
我已经将subtring_index属性设置为,
并在其上创建了上下文索引,定义如下
现在,我正在测试仅使用19000个注册表的查询,并且花了6.739秒才能获得结果 (10458注册表与过滤器匹配),这里的查询
如果我使用像 '% 001%',它需要0.085秒。
我做错什么了吗?我认为仅19000注册管理机构就需要花费很多时间,如何改进我的实施以获得更好的性能?
包含查询的解释计划
操作
对象名称选项字节基数成本CPU_COST IO_COST
SELECT语句
1625 1 2 36093185 1
视图
SYS.null 1625 1 2 36093185 1
过滤谓词
和
从 $ _ 子查询 $ _ 002。行数 <= 0 50
从 $ _ 子查询 $ _ 002。行数> 0
窗口
排序297 1 2 36093185 1
表访问
公民按索引ROWID 297 1
域索引
Idx _ 公民 _ txt 1
访问谓词
CTXSYS.CONTAINS(CTZ.FULL_TEXT_SEARCH,'% 001%')>0
例如,我有一个表,其中将有数百万条记录。
CREATE TABLE employee (ID NUMBER NOT NULL ENABLE, EMPLOYEE_NUMBER VARCHAR2(100 CHAR), FULLNAME VARCHAR2(100 CHAR) NOT NULL ENABLE, GENDER NUMBER(1,0), CITY_NAME VARCHAR2(100 CHAR), FULL_TEXT_SEARCH CLOB);复制
FULL_TEXT_SEARCH是我在其中连接了EMPLOYEE_NUMBER,FIRSTNAME和CITY_NAME的列。
我已经将subtring_index属性设置为,
BEGIN ctx_ddl.set_attribute('CTXSYS.BASIC_WORDLIST', 'SUBSTRING_INDEX', 'TRUE'); END;复制
并在其上创建了上下文索引,定义如下
CREATE INDEX idx_employee_txt ON employee (full_text_search) INDEXTYPE IS ctxsys.context PARAMETERS ( 'wordlist CTXSYS.BASIC_WORDLIST MEMORY 50M SYNC(ON COMMIT)' );复制
现在,我正在测试仅使用19000个注册表的查询,并且花了6.739秒才能获得结果 (10458注册表与过滤器匹配),这里的查询
SELECT COUNT(1) OVER() AS totalRegistries, emp.ID, emp.EMPLOYEE_NUMBER, emp.FULLNAME, emp.GENDER, emp.CITY_NAME FROM employee emp WHERE CONTAINS(emp.full_text_search, '%001%') > 0 ORDER BY emp.FULLNAME ASC NULLS LAST OFFSET 0 ROWS FETCH FIRST 50 ROWS ONLY;复制
如果我使用像 '% 001%',它需要0.085秒。
我做错什么了吗?我认为仅19000注册管理机构就需要花费很多时间,如何改进我的实施以获得更好的性能?
包含查询的解释计划
操作
对象名称选项字节基数成本CPU_COST IO_COST
SELECT语句
1625 1 2 36093185 1
视图
SYS.null 1625 1 2 36093185 1
过滤谓词
和
从 $ _ 子查询 $ _ 002。行数 <= 0 50
从 $ _ 子查询 $ _ 002。行数> 0
窗口
排序297 1 2 36093185 1
表访问
公民按索引ROWID 297 1
域索引
Idx _ 公民 _ txt 1
访问谓词
CTXSYS.CONTAINS(CTZ.FULL_TEXT_SEARCH,'% 001%')>0
专家解答
索引 (不仅仅是上下文索引) 的响应时间通常与 * 返回 * 给客户端的数据量成比例。
例如,如果您的employee表有10亿条记录并且仍然返回10458行,则上下文索引仍将为6秒,标准将 * lot * 更长。
要记住的一件事是,子字符串索引恰好是,即 * 所有 * 子字符串可能。
你可能想尝试几件事。
1) 选择人们可以搜索的最小/最大长度,例如
因此,不包括少于4个字符的索引条目,并且您的应用程序不会让它们搜索
2) 看看通配符索引是否有帮助
这些的可用性取决于版本。
例如,如果您的employee表有10亿条记录并且仍然返回10458行,则上下文索引仍将为6秒,标准将 * lot * 更长。
要记住的一件事是,子字符串索引恰好是,即 * 所有 * 子字符串可能。
你可能想尝试几件事。
1) 选择人们可以搜索的最小/最大长度,例如
begin ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE'); ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH', '4'); ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', '10'); ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES'); end;复制
因此,不包括少于4个字符的索引条目,并且您的应用程序不会让它们搜索
2) 看看通配符索引是否有帮助
begin ctx_ddl.create_preference('mywordlist','BASIC_WORDLIST'); ctx_ddl.set_attribute('mywordlist','WILDCARD_INDEX','TRUE'); end;复制
这些的可用性取决于版本。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
563次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
485次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
459次阅读
2025-04-01 11:08:44
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
454次阅读
2025-04-08 09:12:48
墨天轮个人数说知识点合集
JiekeXu
452次阅读
2025-04-01 15:56:03
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
442次阅读
2025-04-22 00:20:37
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
424次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
417次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
401次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
372次阅读
2025-04-17 17:02:24