Tsql 字符串分割性能问题

Tsql 字符串分割性能问题,tsql,split,sql-server-2016,Tsql,Split,Sql Server 2016,我有两个查询,它们将逗号分隔的列表拆分为行,并插入到表变量中 对于第一个查询,我使用了自定义函数,它是: 用户定义的溢出函数 Create FUNCTION [dbo].[Split_S] ( @sInputList VARCHAR(MAX) ,@sDelimiter VARCHAR(8) ) RETURNS @List TABLE ([item] VARCHAR(8000)) AS BEGIN DECLARE @sItem VARCHAR(MAX) WHILE

我有两个查询,它们将逗号分隔的列表拆分为行,并插入到表变量中

对于第一个查询,我使用了自定义函数,它是:

用户定义的溢出函数

Create FUNCTION [dbo].[Split_S]
(
    @sInputList VARCHAR(MAX)
   ,@sDelimiter VARCHAR(8)      
) 
RETURNS @List TABLE ([item] VARCHAR(8000)) 
AS
BEGIN
DECLARE @sItem VARCHAR(MAX) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
    SELECT
        @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1)))
        ,@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

    IF LEN(@sItem) > 0
        INSERT INTO @List SELECT @sItem
    END

    IF LEN(@sInputList) > 0
        INSERT INTO @List SELECT @sInputList-- Put the last item in
RETURN 
END
问题2:

DECLARE @F2 TABLE(F BIGINT) 
INSERT INTO @F2
SELECT Value 
from  
STRING_SPLIT(N'82,13,51,68,6',',')
两个查询的查询计划

为什么37%和使用STRING_分割其63%。 但若我只比较select语句,那个么字符串分割的查询成本是1%


哪个查询具有更好的性能以及原因?

如果只检查包含select查询的查询部分,则会发现使用字符串分割可以根据执行计划(EP)提供更好的性能。结果将是99%对1%


但是当我们使用STRING_SPLIT函数返回的数据(例如“select…into”或类似于您的“insert…select”)时,您可能会注意到服务器使用“表假脱机(Eager spool)“这就不同了。该操作符获取行并将其存储在tempdb数据库中的隐藏临时对象中(使用此逻辑的想法是,假脱机数据可以在执行计划中稍后重用)。“急切”假脱机一次从以前的运算符中获取所有行,这意味着这是“阻塞运算符”

您使用哪种语言?顺便说一句,它的T-SQL 2016,如果您将统计IO设置为ON,那么您将看到差异;-)
DECLARE @F2 TABLE(F BIGINT) 
INSERT INTO @F2
SELECT Value 
from  
STRING_SPLIT(N'82,13,51,68,6',',')