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

时间:2010-09-30 06:45:08

标签: sql-server performance substring

这是一个基于效果的问题,而不是“I don't understand”或“best practice”问题。

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

例如,如果varchar的值为1234567890,我会寻找2345部分。

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

SELECT SUBSTRING(account,2,4) FROM payment

SELECT RIGHT(LEFT(account,5),4) FROM payment

通过在1,760,335条记录的表格上使用右键,我注意到了轻微的优势,但我不确定这是否是由于缓存查询等原因。

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

1 个答案:

答案 0 :(得分:2)

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

另外还有两件事可能(模糊地)相关:

  • 内存消耗;如果LEFT / RIGHT组合消耗更多内存,我会很好奇。从理论上讲,第一个函数的返回值需要存储,以便可以传递给第二个函数,尽管可以反复使用相同的寄存器。

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

当使用chars和varchars在字符串限制之外发出请求时,SQL Server也非常宽容。以下代码将运行,没有任何错误。

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

所以会:

SELECT right(left(@test, 500), 400);

我的猜测是,你问题答案的解释取决于相关内容;不幸的是,我不知道你的问题的答案。

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