Sql server SQLServer中子字符串与左右组合的相对性能
这是一个基于性能的问题,而不是一个“或”问题。 我在SQLServer数据库中有一个varchar字段,保证长度超过7个字符。 我需要提取一个char(4)字段,该字段由varchar中的第2、第3、第4和第5个字符组成 例如,如果varchar的值为1234567890,我将查找2345部件 在左右组合上使用子字符串是否有性能优势Sql server SQLServer中子字符串与左右组合的相对性能,sql-server,performance,substring,Sql Server,Performance,Substring,这是一个基于性能的问题,而不是一个“或”问题。 我在SQLServer数据库中有一个varchar字段,保证长度超过7个字符。 我需要提取一个char(4)字段,该字段由varchar中的第2、第3、第4和第5个字符组成 例如,如果varchar的值为1234567890,我将查找2345部件 在左右组合上使用子字符串是否有性能优势 SELECT SUBSTRING(account,2,4) FROM payment 或 我注意到在包含1760335条记录的表上使用左右键有一点好处,但我不确定
SELECT SUBSTRING(account,2,4) FROM payment
或
我注意到在包含1760335条记录的表上使用左右键有一点好处,但我不确定这是否是由于缓存查询之类的原因
更新
我做了更多的家庭作业。在这种情况下,似乎右-左最终作为右子字符串执行。这是规定吗?或者仅仅是SQLServer决定剥下这只猫的皮的方式?
一个有趣的问题。您对SQL Server可能通过优化显著更改每条语句的评估可能是准确的;与您的评估相同,在如此大的一个集合中,SQL Server可能能够更好地缓存一个查询 我想到了另外两件可能(模糊地)相关的事情:
- 内存消耗;我想知道左/右组合是否会消耗更多的内存。理论上,需要存储第一个函数的返回值,以便将其传递给第二个函数,尽管可能会反复使用相同的寄存器
- 边界检查。varchar基本上是指向char[]开头的指针,带有两个额外的字节以指示长度。这表明,当通过索引访问某个值时,需要执行某种边界检查,方法是查看这两个字节中包含的值,以确保该值不超出范围
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的内部结构有更多的了解。在您的环境中,唯一可以确保的方法是基准测试。。。
SELECT right(left(@test, 500), 400);