子串的SQLServer与左右组合的相对性能

Ron*_*fin 10 sql-server performance substring

这是一个基于表现的问题,而不是" 我不理解 "或" 最佳实践 "的问题.

我在SQLServer数据库中有一个varchar字段,保证长度超过7个字符.我需要提取一个char(4)字段,该字段由varchar中的第2,第3,第4和第5个字符组成.

例如,如果varchar的值为1234567890,那么我将寻找2345部分.

在左右组合中使用子字符串是否有性能优势?

SELECT SUBSTRING(account,2,4) FROM payment
Run Code Online (Sandbox Code Playgroud)

要么

SELECT RIGHT(LEFT(account,5),4) FROM payment
Run Code Online (Sandbox Code Playgroud)

我注意到在一个有1,760,335条记录的表格上使用右键左边有一点点优势,但我不确定这是否是由于缓存查询等原因造成的.

更新 我做了更多的功课.似乎在这种情况下,右 - 左最终作为右子串执行.这是一个规则吗?或者它只是SQLServer决定皮肤这个特殊猫的方式? 替代文字

Tim*_*ora 2

对于一个有趣的问题+1。您对 SQL Server 可能通过优化显着改变每个语句的评估可能是准确的;与您的评估相同,即在如此大的集合中,SQL Server 可能能够比另一个查询更好地缓存一个查询。

我想到了另外两件事可能(隐约)相关:

  • 内存消耗;我很好奇左/右组合是否消耗更多的内存。理论上,需要存储第一个函数的返回值,以便将其传递到第二个函数中,尽管可能会反复使用相同的寄存器。

  • 边界检查。varchar 基本上是一个指向 char[] 开头的指针,带有 2 个额外字节用于指示长度。这表明,在通过索引访问值时,需要通过查看这 2 个字节中包含的值来执行某种边界检查,以确保它没有超出范围。

当使用 chars 和 varchars 发出超出字符串限制的请求时,SQL Server 也非常宽容。以下代码将运行,不会出现任何错误。

DECLARE @Test varchar(50);
SET @Test = 'Hello World';
SELECT substring(@Test, 2, 4);
SELECT substring(@Test, 2000, 5000);
Run Code Online (Sandbox Code Playgroud)

所以将:

SELECT right(left(@test, 500), 400);
Run Code Online (Sandbox Code Playgroud)

我的猜测是,对你的问题的答案的解释在于相关的东西;不幸的是我不知道你问题的答案。

我很好奇如果使用更长的字符串或 char 与 varchar 能获得相同的性能结果。这些测试可以让您更深入地了解 SQL Server 的内部结构。