在 WHERE 中使用 Oracle 内置的 UPPER 函数会导致 SELECT 语句性能不佳?

Using Oracle build-in UPPER function in WHERE lead to bad performance of SELECT statement?

我们的 Oracle 数据库应用程序包含一个名为 PERSON
的 Table 此 Table 包含名为 PERSON_NAME
的列 此外,我们在此列上有一个 INDEX 以加速 SELECT 使用此列

所以当我们使用以下 SQL 语句时性能很好

SELECT *
FROM PERSON
WHERE 1=1
AND PERSON_NAME = '  Yajli  '
;

但在一些业务案例中
我们需要通过 PERSON_NAME 搜索不区分大小写

所以我们尝试遵循 SQL 语句

SELECT *
FROM PERSON
WHERE 1=1
AND UPPER(PERSON_NAME) = UPPER('  YajLi  ')
;

但这会导致性能不佳,SELECT 在这种情况下查询会花费很多时间

任何帮助如何一起提高SELECT在两种情况下的性能
* 按 PERSON_NAME 搜索不区分大小写
* 按 PERSON_NAME 搜索区分大小写

您的相对性能会很差,因为原始查询使用 PERSON_NAME 上的索引。但是,当您应用函数时,Oracle 不再使用索引。

如果这是您需要经常做的事情(正如您所建议的),那么您可以在该函数上创建一个索引:

CREATE INDEX idx_person_upper_personname ON PERSON(UPPER(PERSONNAME));

那么当你在 WHERE 子句中使用函数 UPPER(PERSON) 时,Oracle 将使用这个索引。