Sql server 如果所有值都是大写,是否需要大写索引?

Sql server 如果所有值都是大写,是否需要大写索引?,sql-server,indexing,Sql Server,Indexing,我有一个表ATable,在a和b上创建了索引 我知道a和b中的所有值都是大写的 我怀疑索引在这个实例中的行为是正确的 select * from BTable b join ATable a on upper(b.a) = a.a and upper(b.b) = a.b; 但是如果我做一个选择,比如 select * from BTable b join ATable a on upper(b.a) = upper(a.a) and upp

我有一个表
ATable
,在
a
b
上创建了索引

我知道
a
b
中的所有值都是大写的

我怀疑索引在这个实例中的行为是正确的

select
    *
from
    BTable b 
join
    ATable a on upper(b.a) = a.a and upper(b.b) = a.b;
但是如果我做一个选择,比如

select
    *
from
    BTable b 
join
    ATable a on upper(b.a) = upper(a.a) and upper(b.b) = upper(a.b);
我的索引会被使用吗?或者我需要在
ATable(上(a),上(b))上创建索引吗


排序规则是:

select DATABASEPROPERTYEX('MyDB','Collation');
-----
SQL_Latin1_General_CP1_CI_AS

不,不需要大写索引

由于您使用的是不区分大小写的排序规则,因此查询中也不需要
upper
,如上所述,
upper
函数可以进行该查询(在下面的示例中没有)。如果删除
上部的
,并且这些列上有索引,则可以使用它。我说可以,因为您正在执行
select*
,所以优化器可能会选择表扫描,因为您需要所有列

更详细地说,由于排序规则不区分大小写
abc
abc
相同,因此无论是否使用
upper
函数,都会返回相同的结果,但性能不一样,因为:

  • upper
    函数本身需要时间和资源才能运行
  • 它会使查询不可争论,这意味着您的索引无法使用,从而影响性能
通过检查,您可以看到这一点。你会看到功能受损

这是代码,以及该链接中的执行计划图片

create table #t1(c1 varchar(8) not null)
alter table #t1 add constraint t1_PK primary key (c1)

create table #t2(c1 varchar(8) not null)
alter table #t2 add constraint t2_PK primary key (c1)

insert into #t1
values
('aaa'),
('BBB'),
('ccc'),
('DDD')

insert into #t2
values
('AAA'),
('bbb'),
('Ccc'),
('dDD')

select *
from #t1 t1
inner join #t2 t2
on t1.c1 = t2.c1

select *
from #t1 t1
inner join #t2 t2
on upper(t1.c1) = upper(t2.c1)

drop table #t1
drop table #t2

这取决于您的排序规则,但是,如果您运行该查询并检查执行计划,您将看到联接谓词是否使用了索引。如果您有一个区分大小写的排序规则,那么它很可能是不可争论的。可能重复的。如果a.a是大写的,为什么您需要a.a和upper?@scsimon我被要求查看一个数据库上的查询,而我目前没有具有运行执行计划的权限。我怀疑这个组合可能有问题,但我现在不知道有什么方法来验证。我会在这个问题上添加排序规则。比你好,兰格先生!