Oracle 11g 文本:复合域索引 - 对来自不同表的列进行过滤

Posted

技术标签:

【中文标题】Oracle 11g 文本:复合域索引 - 对来自不同表的列进行过滤【英文标题】:Oracle 11g Text: Composite Domain Index - FILTER BY on columns from different tables 【发布时间】:2012-05-18 04:34:59 【问题描述】:

我正在使用 Oracle 11g 文本,

AuthorTable:(作者详细信息表) AuthorId、AuthorName、AuthorDOB

ArticleTable:(文章内容表)ArticleId、WrittenDate、PublishDate、ARTICLE_TXT (CLOB)

LocationTable:(位置表)LocationId、LocationState、LocationCity

ArticleAuthorAssocTable:(文章-作者关联表)AuthorId、ArticleId

LocAuthorAssocTable:(作者-位置关联表)AuthorId、LocationId、LocationStartDate、LocationEndDate

我的查询需要搜索 ARTICLE_TXT 上的任何输入搜索词以及 PublishDate / WrittenDate / AuthorDOB / LocationCity / LocationStartDate 范围上的任何其他查询。

由于必须进行混合查询,我开始在 ArticleTable 上创建复合域索引 CDI。

    CREATE INDEX ARTICLE_TXT_CDI_IDX ON ArticleTable(ARTICLE_TXT) 
    INDEXTYPE IS ctxsys.CONTEXT 
    FILTER BY WrittenDate, PublishDate

查询为

SELECT 

/*+ domain_index_sort domain_index_filter(ARTICLE_TXT_CDI_IDX) */      article.ARTICLE_TXT, 

author.AuthorName , article.WrittenDate, article.PublishDate, LocationTable.LocationCity ,location.LocationStartDate, location.LocationEndDate 

FROM 

  ArticleTable article

  INNER JOIN 
  ArticleAuthorAssocTable  articleAuthorAssoc ON article.articleId = articleAuthorAssoc .articleId 

  INNER JOIN 
  AuthorTable author ON author.authorId= articleAuthorAssoc.authorId

  INNER JOIN 
  LocAuthorAssocTable locAuthorAssoc req ON author.authorId = locAuthorAssoc.authorId

INNER JOIN 
  LocationTable location ON location .authorId = locAuthorAssoc.authorId

WHERE

 CONTAINS(article.ARTICLE_TXT, 'Something') >0

 AND author.AuthorDOB BETWEEN TO_DATE('01/01/2001','MM/DD/YYYY') 
AND TO_DATE('12/31/2012','MM/DD/YYYY')

 AND location.LocationId IN (1,2)

现在我的问题是:

    是否可以使用 FILTER BY 创建复合域索引 来自不同表的列? 还有其他方法可以改进上述查询吗?

根据我的研究,一些选项使用物化视图、基于函数的索引、USER_DATASTORE

但不幸的是,仍然不确定如何使用它们...请帮助我了解您的知识。

谢谢

【问题讨论】:

【参考方案1】:

我认为这个问题的最佳解决方案是向 ArticleTable 添加一个 XML 列,您可以在其中组合文章的所有必需信息。

然后您需要在相关表中添加触发器,以便在发生数据更改时重新创建此 xml。

通过这种方式,您可以索引此 xml 列并使用节组搜索非常具体的信息(例如“PATH_SECTION_GROUP”)

【讨论】:

以上是关于Oracle 11g 文本:复合域索引 - 对来自不同表的列进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE11g 反复插数据删数据,删索引建索引,对数据文件和表空间有啥影响

Oracle 复合索引--转载

ORACLE 数据库需要创建索引的规则

Oracle 复合索引设计原理——前缀性和可选性

Oracle 11g 预估索引大小

存在唯一索引时,Oracle 10g 和 11g 之间 REF CURSOR 的行为不同?