Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQLServer中子字符串与左右组合的相对性能_Sql Server_Performance_Substring - Fatal编程技术网

Sql server SQLServer中子字符串与左右组合的相对性能

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条记录的表上使用左右键有一点好处,但我不确定

这是一个基于性能的问题,而不是一个“或”问题。

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

例如,如果varchar的值为1234567890,我将查找2345部件

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

SELECT SUBSTRING(account,2,4) FROM payment

我注意到在包含1760335条记录的表上使用左右键有一点好处,但我不确定这是否是由于缓存查询之类的原因

更新 我做了更多的家庭作业。在这种情况下,似乎右-左最终作为右子字符串执行。这是规定吗?或者仅仅是SQLServer决定剥下这只猫的皮的方式?
一个有趣的问题。您对SQL Server可能通过优化显著更改每条语句的评估可能是准确的;与您的评估相同,在如此大的一个集合中,SQL Server可能能够更好地缓存一个查询

我想到了另外两件可能(模糊地)相关的事情:

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

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

SQL Server在使用CHAR和VARCHAR发出超出字符串限制的请求时也非常宽容。以下代码将在没有任何错误的情况下运行

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);