这是一个基于性能的问题,而不是“
I don’t understand”或“
best practice”问题.
我在sqlServer数据库中有一个varchar字段,该字段保证长于7个字符.
我需要提取一个由varchar中的第2,第3,第4和第5个字符组成的char(4)字段.
例如,如果varchar的值为1234567890,我将寻找2345部分.
在右上角的组合中使用子字符串有性能优势吗?
SELECT SUBSTRING(account,2,4) FROM payment
要么
SELECT RIGHT(LEFT(account,5),4) FROM payment
我已经注意到使用右边的左边有一个1,760,335条记录,但我不知道这是否是由于缓存查询等原因.
UPDATE
我做了更多的功课似乎在这种情况下,右左最终被执行为右子字串.这是规则吗还是只是sqlServer决定皮肤这个特定的猫的方式?
解决方法
1为一个有趣的问题.您评估sql Server可能通过优化显着地更改每个语句可能是准确的;与您的评估相同,在这样大的集合中,sql Server可能能够比一个查询更好地缓存一个查询.
另外还有两件事情可能是(模糊的)相关的:
>内存消耗;如果LEFT / RIGHT组合消耗更多的内存,我会很好奇.在理论上,第一个函数的返回值将需要被存储,以便它可以被传递到第二个函数中,尽管同一个寄存器可能被反复使用.
>边界检查. varchar基本上是一个指向char []的开头的指针,其中有两个额外的字节用于指示长度.这表明,通过查看这2个字节中包含的值以确保它不超出范围,通过索引访问值时,需要执行某种边界检查.
在使用char和varchars的字符串限制之外,sql Server也非常宽恕.以下代码将运行没有任何错误.
DECLARE @Test varchar(50); SET @Test = 'Hello World'; SELECT substring(@Test,4); SELECT substring(@Test,2000,5000);
所以将:
SELECT right(left(@test,500),400);
我的猜测是,对你的问题的答案的解释在于有关的东西;不幸的是,我不知道你的问题的答案.
如果您使用较长的字符串或char与varchar得到相同的性能结果,我会很好奇.这些测试可以为sql Server的内部结构提供更多的见解.