where 子句中的 function

1
2
3
SELECT first_name, last_name, phone_number
FROM employees
WHERE UPPER(last_name) = UPPER('winand')

虽然 LAST_NAME 已有索引,但是执行计划并没有使用索引,仍然是全表扫描。因为数据库认为函数的计算结果跟传入参数之间并不相关。为了支持该查询,需要新建一个涵盖实际搜索词的索引。

1
2
CREATE INDEX emp_up_name 
ON employees (UPPER(last_name))

这种在定义中包含函数或者运算表达式的索引称为基于函数的索引 (function-based index)。建索引时执行相关的计算并把计算结果存到索引中。

阅读更多