当我们在执行查询语句的时候,利用索引可以避免全表搜索,加快查询速度,但是如果你的where子句是这样写的话:where to_char(birth_day,'YYYY-MM-DD') = '1978-11-10' ,而你的索引只是针对birth_day本身,那么这个索引对于你的查询是没有任何效果的,因为你的查询是在函数运算过后再开始比较的。
对于此类方法,一种是把函数写在=号右边,及避免运算后再比较,对于诸如 age/2 > 20 就可以变成 age > 20 * 2 。然而对于无法移动的,例如我们上面的例子,就只能使用函数式索引(function-based index)。
函数式索引创建也很简单,只要在原来填写字段的地方,用函数表达式换上就可以,比如 create index ixbirthday on tPeople ( to_char(birth_day,'YYYY-MM-DD')) 。这样就可以创建一个函数式索引,但是在真正生效之前,我们需要做一些外围的环境设置:
设置启动参数:
QUERY_REWRITE_INTEGRITY must be set to TRUSTED
QUERY_REWRITE_ENABLED must be set to TRUE
COMPATIBLE must set to 8.1.0.0.0 or a greater value
然后在创建索引之后,必须重新分析表 analyze.
至于如何检验你创建的索引是否生效,最直观的方法是比较查询时间,如果你的数据量很大,那差异就会比较明显。另外一个方法是使用EXPLAIN计划。我会在另外一篇文章里来详细说明EXPLAIN表的使用。
Sunday, August 20, 2006
Oracle 的函数式索引
标签:
previous article
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment