在 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 将使用这个索引。
我们的 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 将使用这个索引。