此处显示的陈述存在哪些问题?什么可以改变,这将允许比这一个更有效的声明?我在接受采访时被问到了。
SELECT
DATE, location, USER_ID
FROM
customers
WHERE
UPPER(name) = 'SATISH';
答案 0 :(得分:2)
这是您的查询:
SELECT DATE, location, USER_ID
FROM customers
WHERE UPPER(name) = 'SATISH';
提高查询效率基本上是关于使用索引。
首先,许多数据库默认情况下不区分大小写。所以这个查询可以等同于:
WHERE name = 'SATISH'
但是,此版本可以利用users(name)
上的索引。即使是不区分大小写的排序规则也可能不会使用带有UPPER()
函数的索引。
如果您的数据库区分大小写,则会想到三个选项:
并非所有数据库都支持所有这三种方法。
您可以使用check
约束强制执行第一个:
check chk_user_name_uppercase (name = upper(name));
您可以在某些数据库中实现第二个:
create index idx_user_uname on user(upper(name));
您可以将第三个实现为:
alter table user add name_upper as (upper(name));
create index idx_user_name_upper on user(name_upper);
然后where
子句看起来像:
where name_upper = 'SATISH'
答案 1 :(得分:1)
由于您在列上使用了函数,因此可能未使用名称上的索引。许多DB-System支持不区分大小写的索引/搜索,因此不需要上层。
在其他情况下,将名称存储为大写(可能是额外的列)可能很有用。然后也需要搜索值的上限。