Sql Server REPLACE 函数是否会增加估计的行大小?

Ale*_*ola 3 sql-server replace

分析一个简单的查询,我注意到 REPLACE 函数增加了估计的行大小。查看在 AdventureWorks 上执行的以下查询:

select p.BusinessEntityID, REPLACE(p.FirstName, 'a', 'b') as X
from Person.Person p
Run Code Online (Sandbox Code Playgroud)

以下是执行计划。仅应用与 REPLACE 函数相关的计算标量组件时,估计的行大小从 65 B 开始增加到 4015 B。谁能解释一下吗?

测试在Sql Server 2022上完成。

提前致谢。

在此输入图像描述

Pau*_*ite 7

SELECT TOP (1) 
    BaseType = SQL_VARIANT_PROPERTY(REPLACE(P.FirstName, 'a', 'b'), 'BaseType'),
    MaxLen = SQL_VARIANT_PROPERTY(REPLACE(P.FirstName, 'a', 'b'), 'MaxLength')
FROM Person.Person AS P;
Run Code Online (Sandbox Code Playgroud)
基本类型 最大长度
nvarchar 8000

通常,您可以用较长的子字符串替换较短的子字符串。考虑到所提供的子字符串的长度、预期匹配的数量以及字节计数的任何差异,即使字符数相同,SQL Server 似乎也不会尝试确定结果的确切最大长度。

对于非最大输入,返回类型限制为 8000 字节(如文档所述)。与往常一样,可变长度列的估计值是最大长度的 50%。

如果这给您带来问题,您当然可以明确地CASTCONVERT结果。REPLACE作为旁注,通常最好匹配数据类型,因此示例中的文字应具有 N 前缀,如FirstNamenvarchar(50)

SELECT CONVERT(nvarchar(50), REPLACE(P.FirstName, N'a', N'b'))
FROM Person.Person AS P;
Run Code Online (Sandbox Code Playgroud)

固定的