SQL Server:为什么在不区分大小写的列上执行SELECT比在区分大小写的列上快?

4
我使用SQL Server 2016 Express和版本为4.2的JDBC驱动的Java应用程序。
我的数据库排序规则为Latin1_General_CI_AS(不区分大小写)。 我的表有一个类型为VARCHAR(128)NOT NULL的列。该列上有一个唯一索引。
我的测试场景如下:
插入了150000个字符串,每个字符串长度为48个字符,然后随机选择200个现有字符串进行200次选择。我测量所有查询的总执行时间。
然后我删除索引,将表更改为列排序规则为Latin1_General_CS_AS(区分大小写),然后重新创建唯一索引。
然后200个选择总共需要更多时间。
在CI和CS两种情况下,执行计划都很简单且相同(使用索引搜索)。
查询执行时间不仅取决于区分大小写。如果字符串具有相同的前缀,则使用CS排序规则会更快地增长。以下是我的结果(以秒为单位的执行时间):
+----+---------+------------------+-------------------+-------------------+
|    + RND(48) + CONST(3)+RND(45) + CONST(10)+RND(38) + CONST(20)+RND(28) +
+----+---------+------------------+-------------------+-------------------+
| CI +       6 +                6 +                 7 +                 9 +
| CS +      10 +               20 +                45 +                78 +
+----+---------+------------------+-------------------+-------------------+

随机字符串的相同前缀越长,区分大小写的查询所需时间就越长。

  1. 为什么在不区分大小写的列上搜索比在区分大小写的列上搜索更快?
  2. 相同前缀行为的原因是什么?

“使用索引进行搜索”是什么意思?索引扫描速度较慢,而索引查找速度较快。请发布查询和执行计划。 - Panagiotis Kanavos
顺便问一下,你在重新创建索引时是否指定了新的排序规则?如果字符串具有相同的前缀,则它们增长更快是什么意思?你无法使用索引在字段中间进行搜索,例如 LIKE '%whatever'。只有匹配前缀的查询才能使用索引,即 LIKE 'whatever%'任何一个查询都使用了索引吗? - Panagiotis Kanavos
1个回答

0

原因是您的SQL安装(我猜测)是使用CI排序规则完成的。这意味着您的tempdb和master数据库正在使用CI,而当前您自己的数据库也是如此。因此,即使您将字符列更改为CS,当它在tempdb中用于排序/合并操作时,也会在CI上下文中执行。要获得准确的比较结果,您需要将安装排序规则更改为CS或在不同的SQL实例上并排进行比较-一个使用CS,另一个使用CI。


只有在没有索引或数据量太大而服务器必须存储部分结果时,才会使用tempdb。如果未使用索引,则可能发生这种情况。OP提到了前缀,这让我想知道查询是否使用诸如LIKE'%something'之类的条件。 - Panagiotis Kanavos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接