什么是比显示的更有效的SQL语句

时间:2018-02-24 11:36:42

标签: sql where-clause case-insensitive

此处显示的陈述存在哪些问题?什么可以改变,这将允许比这一个更有效的声明?我在接受采访时被问到了。

SELECT
    DATE, location, USER_ID
FROM
    customers
WHERE
    UPPER(name) = 'SATISH';

2 个答案:

答案 0 :(得分:2)

这是您的查询:

SELECT DATE, location, USER_ID
FROM customers
WHERE UPPER(name) = 'SATISH';

提高查询效率基本上是关于使用索引。

首先,许多数据库默认情况下不区分大小写。所以这个查询可以等同于:

WHERE name = 'SATISH'

但是,此版本可以利用users(name)上的索引。即使是不区分大小写的排序规则也可能不会使用带有UPPER()函数的索引。

如果您的数据库区分大小写,则会想到三个选项:

  1. 将名称存储为大写。
  2. 使用基于函数的索引。
  3. 使用生成的列而不是基列
  4. 并非所有数据库都支持所有这三种方法。

    您可以使用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支持不区分大小写的索引/搜索,因此不需要上层。

在其他情况下,将名称存储为大写(可能是额外的列)可能很有用。然后也需要搜索值的上限。