问题描述
嗨,
我们有一个使用Oracle数据库保存公司数据的应用程序。
其中一个名为PWORKSPACEOBJECT的表在GUI客户端中保存所有 “可显示” 对象。
大多数情况下,用户仅通过在GUI中键入 * 某些文本 * 来搜索某些数据。系统产生的查询是:
给出表PWORKSPACEOBJECT保存25 078 045条记录和pobject_name列的类型为VARCHAR2(128字节) 的事实,我们得到如下执行计划:
索引如下:
有什么方法可以通过更改索引或其他方式来改善此查询?
最好的问候
彼得
我们有一个使用Oracle数据库保存公司数据的应用程序。
其中一个名为PWORKSPACEOBJECT的表在GUI客户端中保存所有 “可显示” 对象。
大多数情况下,用户仅通过在GUI中键入 * 某些文本 * 来搜索某些数据。系统产生的查询是:
SELECT DISTINCT t_02.puid FROM PWORKSPACEOBJECT t_01 , PITEM t_02 WHERE ( UPPER(t_01.pobject_name) LIKE UPPER( '%some text%' ) AND ( t_01.puid = t_02.puid ) ) ;复制
给出表PWORKSPACEOBJECT保存25 078 045条记录和pobject_name列的类型为VARCHAR2(128字节) 的事实,我们得到如下执行计划:
Execution Plan ---------------------------------------------------------- Plan hash value: 2506165203 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1253K| 62M| | 101K (1)| 00:20:21 | | 1 | HASH UNIQUE | | 1253K| 62M| 72M| 101K (1)| 00:20:21 | | 2 | NESTED LOOPS | | 1253K| 62M| | 85588 (1)| 00:17:08 | |* 3 | TABLE ACCESS FULL| PWORKSPACEOBJECT | 1253K| 44M| | 85583 (1)| 00:17:07 | |* 4 | INDEX UNIQUE SCAN| PIPITEM | 1 | 15 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(UPPER("POBJECT_NAME") LIKE '%BL%') 4 - access("T_01"."PUID"="T_02"."PUID") ----------------------------------------------------------复制
索引如下:
PIPWORKSPACEOBJ_2 NONUNIQUE NORMAL NO NO POBJECT_NAME PIPWORKSPACEOBJ_3 NONUNIQUE FUNCTION-BASED NORMAL NO NO SYS_NC00031$ PIPWORKSPACEOBJ_3 is -> ASC UPPER("POBJECT_NAME")复制
有什么方法可以通过更改索引或其他方式来改善此查询?
最好的问候
彼得
专家解答
可悲的是,如果您使用前导通配符,Oracle数据库将无法对索引进行范围扫描。这是因为您的搜索可以匹配索引中的任何条目。
要解决这个问题,请考虑创建Oracle文本索引。然后更改您的查询以使用contains运算符而不是像
有关更多详细信息,请阅读开发人员指南:
https://docs.oracle.com/en/database/oracle/oracle-database/18/ccapp/toc.htm
或者来自Tim Hall的这个例子:
https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i
本站也有几个例子。
要解决这个问题,请考虑创建Oracle文本索引。然后更改您的查询以使用contains运算符而不是像
有关更多详细信息,请阅读开发人员指南:
https://docs.oracle.com/en/database/oracle/oracle-database/18/ccapp/toc.htm
或者来自Tim Hall的这个例子:
https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i
本站也有几个例子。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
521次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
499次阅读
2025-04-15 17:24:06
墨天轮个人数说知识点合集
JiekeXu
410次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
407次阅读
2025-04-08 09:12:48
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
390次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
389次阅读
2025-04-01 11:08:44
Oracle 19c RAC更换IP实战,运维必看!
szrsu
350次阅读
2025-04-08 23:57:08
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
343次阅读
2025-04-20 10:07:02
oracle定时任务常用攻略
virvle
320次阅读
2025-03-25 16:05:19
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
318次阅读
2025-04-15 14:48:05