加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – Substring与右左组合的SQLServer中的相对性能

发布时间:2020-12-12 08:34:20 所属栏目:MsSql教程 来源:网络整理
导读:这是一个基于性能的问题,而不是“ I don’t understand”或“ best practice”问题. 我在SQLServer数据库中有一个varchar字段,该字段保证长于7个字符. 我需要提取一个由varchar中的第2,第3,第4和第5个字符组成的char(4)字段. 例如,如果varchar的值为123456789
这是一个基于性能的问题,而不是“ 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的内部结构提供更多的见解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读