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我被要求查看一个数据库上的查询,而我目前没有具有运行执行计划的权限。我怀疑这个组合可能有问题,但我现在不知道有什么方法来验证。我会在这个问题上添加排序规则。比你好,兰格先生!