一个表建立了全文索引后,会不会导致性能的下降,一直是我比较关心的问题。这里对这个问题进行简单的讨论。
一个表建立了全文索引,是希望通过全文索引来提高表的查询性能,使得原本只能通过LINK ‘%’的查询,变得可以通过全文索引的扫描而快速得到查询结果。
使用全文索引并不是简单的增加了一个索引那么简单。首先,全文索引导致磁盘资源的大量占用。全文索引本身就是一个利用磁盘空间换取性能的方法。而且,全文索引的索引同步,索引定期维护,以及表本身的维护操作使得这个表的管理成本大大的增加。最重要的一点,使用全文索引并不是对应用透明的。如果要想利用全文索引,必须修改查询语句。原有的查询语句是不可能利用全文索引的,需要改成全文索引规定的语法。
如果付出了这么大的代价,而得不到性能的提示,甚至导致性能有所下降,未免得不偿失。好在全文索引的使用,必须通过指定操作,比如CONTAINS、CATSEARCH和MARCH等,这就是说,全文索引不会影响到其他的SQL语句。
那么剩下的问题就是全文索引能否解决好它本身的问题了。首先考虑的一个问题就是,如果查询一个常用字会不会导致全文索引返回大量的记录,从而导致性能低下。这个问题可以通过添加停用词来解决。但是停用词本身也有问题,查询英文的停用词还好说,如果仅查询中文的停用词,Oracle直接报错。这就又需要开发的配合,如异常捕获等。
如果不使用停用词的话,那么Oracle能否保证在恰当的时候使用全文索引就是问题的关键。
还有一个问题,Oracle一般优先考虑域索引,对于能通过其他索引快速得到结果的情况,Oracle是否能作出正确的判断?
上面是仅包含一个全文索引的情况,如果一张表中建立了两个全文索引,那么Oracle能否正确的选择索引吗?
还有,如果两张表进行关联,而又对两张表的两个字段都进行了全文索引的查询,那么是否会影响查询的效率。
此外,CTXCAT索引包含一个索引集的概念,可以向索引集中添加其他字段,来提高全文索引处理复合查询的性能。不过,这种方法一是要消耗大量的磁盘空间,二是不能替代添加字段本身的索引,那么CTXCAT索引和其他索引的配合使用与使用CTXCAT索引集的性能差别有多大呢,这也是值得关注的地方。
这篇文章对全文索引可能存在的性能问题进行了简单的分析,下面打算通过几篇系列文章对上面的一些问题进行详细的描述。