那些没有在PeopleSoft系统遇到性能问题的人,特别是基于Oracle数据库的PeopleSoft,可能不知道基于函数的索引。
根据定义,基于函数的索引是使用如下方法定义的:
-
基于表达式,例如算术表达式或包含函数的表达式
-
基于降序列(descending ordered column)
然后还有一种叫做函数索引的的表达式,这些索引是包含在索引列周围的表达式的索引。他们在PeopleSoft中非常罕见,为了提高特定SQL语句的性能而创建。
例如PS_NAMES表,有一个索引PS4NAMES中字段NAME_AC为主导列:
SELECT * from PS_NAMES WHERE name_ac='CHENCHEN'
可以看到上述查询语句走的是索引扫描代价是2。
比如我不知道NAME_AC中存储的是大写的拼音还是小写的拼音,一般会用如下SQL语句来查询:
SELECT * from PS_NAMES WHERE UPPER(name_ac)='CHENCHEN'
如果加上UPPER就会走全表扫描,代价是5,显然更花费时间。
添加函数索引到PS_NAMES表。
CREATE INDEX PSZNAMES ON PS_NAMES (UPPER(NAME_AC));
接下来再执行查看代价
可以看到走的是索引扫描,代价是1.
当您在表DBA_IND_COLUMNS中查看索引时,显示的类似是SYS_NC00033$,这是系统生生的列名,要找到真正的列名,要到表DBA_IND_EXPRESSIONS中的COLUMN_EXPRESSION列查看,如图:
基于函数的索引只能通过数据库中创建,不能通过AD工具创建。
我的公众号: