ORACLE中的列索引

ORACLE中的列索引,oracle,Oracle,我有下面的查询,因为MATTER表中有大量数据,执行LIKE语句需要花费大量时间,所以我考虑使用上下文索引和CONTAIN。 我应该只在标题或其他栏目上做索引吗,。根据下面的选择查询 非常感谢您的投入 SELECT DISTINCT dm.MATTER_SEQ FROM MATTER dm ,MATTER_TYPE dmt ,MATTER_SUBTYPE dms ,STATUS ds ,FILING df WHERE dm.MATTER_TYPE_SEQ

我有下面的查询,因为MATTER表中有大量数据,执行LIKE语句需要花费大量时间,所以我考虑使用上下文索引和CONTAIN。 我应该只在标题或其他栏目上做索引吗,。根据下面的选择查询

非常感谢您的投入

SELECT DISTINCT dm.MATTER_SEQ  
FROM MATTER dm
    ,MATTER_TYPE dmt
    ,MATTER_SUBTYPE dms
    ,STATUS ds
    ,FILING df  
 WHERE dm.MATTER_TYPE_SEQ=dmt.MATTER_TYPE_SEQ
   AND dm.MATTER_SUBTYPE_SEQ=dms.MATTER_SUBTYPE_SEQ
   AND dm.STATUS_CODE NOT IN ('abc','jkl','xyz')
   AND dm.STATUS_CODE = DS.STATUS_CODE
   AND dm.IS_EXTERNAL='1'
   AND dm.IS_DELETED='0'
   AND dm.MATTER_SEQ = df.MATTER_SEQ        
   AND trunc(dm.CREATED_DATE) between '01-NOV-95' AND '02-OCT-18'  
   AND upper(dm.MATTER_TITLE) like(upper (q'{%jdasuidhajsndjahs%}'))

尝试创建函数索引(dm.MATTER\u TITLE)和第二个trunc(dm.CREATED\u DATE)


我还考虑到连接条件中的列已经有索引。如果没有,请将它们编入索引

听起来您已经意识到(“%ABC”)的效率非常低,因为它通常不能使用索引并进行完整的表扫描

如果其他优化建议没有多大帮助,那么使用上下文索引可能会获得更好的性能。一定要设置子字符串索引首选项,以便它专门为中缀搜索(如您的)准备索引。(如果在字符串中间也有通配符(‘ABC%DEF’),您可能还需要设置前缀选项。” 还要注意,默认情况下上下文索引不区分大小写,因此不需要执行UPPER()。我还没有尝试将q''文本与contains一起使用,所以我不确定这将如何工作

AND CONTAINS(dm.MATTER_TITLE, q'{%jdasuidhajsndjahs%}') > 0

1) 旧的连接语法2)不可搜索的表达式
upper(dm.MATTER\u TITLE)比如(upper(q'{%jdasuidhajsndjahs%}')
trunc(dm.CREATED\u DATE)介于…
3)
DISTINCT
与单个表不同意味着您要搜索存在,这样您的查询就可以被重写了。外部的数据类型是什么?是否被删除了?如果是数字,那么系统必须进行隐式类型转换,这也会增加一些开销。声明中的那些在做什么<代码>和dm.INDUSTRY(dm.INDUSTRY)中的dm.MATTER(类型)和dm.MATTER(类型)中的dm.MATTER(类型)和dm.MATTER(子类型)中的dm.MATTER。。对1确实=1所以继续…感谢xQbert将这个问题指向另一个小问题,它看起来像
dm。CREATED_DATE
是一个
日期,所以您可能希望在日期'1995-11-01'和日期'2018-10-02'之间使用日期文字,而不是varchar文字-
和trunc(dm.CREATED_DATE)
。。。很抱歉,在我用来表示感谢的实际查询中。。我会尝试同样的方法。嘿,Kfinity,我得到的错误是indextype不存在,我得到的错误是Catsys和CtxCAT都相同。你能帮我吗?你的数据库里有CTXSYS模式吗?您可能需要安装Oracle文本组件。感谢Kfinity,您的投入帮助很大:)
AND CONTAINS(dm.MATTER_TITLE, q'{%jdasuidhajsndjahs%}') > 0