sql - 在WHERE中使用Oracle内置UPPER函数会导致SELECT语句的性能下降吗?

标签 sql oracle query-performance sqlperformance sql-tuning

我们的Oracle数据库应用程序包含一个名为PERSON的表。
该表包含名为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搜索区分大小写

最佳答案

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

如果这是您需要经常执行的操作(如您建议的那样),则可以在函数上创建索引:

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


然后,当您在PERSON_NAME子句中使用函数UPPER(PERSON)时,Oracle将使用此索引。

关于sql - 在WHERE中使用Oracle内置UPPER函数会导致SELECT语句的性能下降吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113106/

相关文章:

java - 如何通过SQL语句从数据库表中获取两个特定日期(由用户指定)之间的数据?

sql - 这个 SQL IF 对 & 符做了什么?

sql - Oracle - 将值从行转换为范围

php - 在 Oracle 和 PHP 中使用 Unicode

mysql - 比较日期查询的性能

mysql - 优化查询。想在子查询中不使用 max 的情况下选择最后一条记录

sql - 更新表记录 - 每 2 个数字添加 '00'

mysql - sql 连接为维恩图

java - 监听器无法启动专用服务器进程

mysql - 我怎样才能使这个sql查询更快?