Sql 子字符串函数是否有更快的替代方法?

Sql 子字符串函数是否有更快的替代方法?,sql,sql-server,ssrs-2012,substr,Sql,Sql Server,Ssrs 2012,Substr,我有一个SSRS报告,它将一系列县传递给一个存储过程。由于我必须构建报告的方式,我需要向县添加36个字符的GUID。然后,我使用子字符串函数去除存储过程中的GUID: and county IN(Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',') 报告运行时间约为8秒,这是对REPLACE功能的巨大改进。但我还是想让它跑得更快。有人知道更好的方法吗?我不允许在表中包含索引,因此这将不是一个选项。如果您先将其加载到

我有一个SSRS报告,它将一系列县传递给一个存储过程。由于我必须构建报告的方式,我需要向县添加36个字符的GUID。然后,我使用子字符串函数去除存储过程中的GUID:

and county IN(Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',')

报告运行时间约为8秒,这是对REPLACE功能的巨大改进。但我还是想让它跑得更快。有人知道更好的方法吗?我不允许在表中包含索引,因此这将不是一个选项。

如果您先将其加载到表变量中,然后再加载到内部联接,您可能会最大限度地提高速度

DECLARE @COUNTYLIST TABLE ([County] varchar(36) PRIMARY KEY);
INSERT INTO @COUNTYLIST ([County])
    Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',')

SELECT ...
FROM ... INNER JOIN @COUNTYLIST as [CountyList] 
    ON ...[County] = [CountyList].[County]

看看这里。如果子字符串真的是问题所在,听起来很奇怪。你确定这不是你的问题的根源吗?您应该真正包括整个语句、查询计划,因为这是一个函数,最好还可以查看计划缓存中的性能统计信息。只有当我添加子字符串()时,它才变慢。当我查看函数的执行计划时,它只显示了两个表插入时50%的成本。有没有一种从变量看统计数据的好方法?当我运行执行计划时,我只能插入一条记录来代替变量。你说fnsplit运行得很快。它看起来像一个字符串拆分器。是否有while循环或游标在其中?由于它是一个表值函数,是否有多个语句?如果是这样的话,它是一个多语句表值函数,通常比标量函数还要慢。计划中的百分比只是估计值,在很多性能不好的情况下,是完全错误的。检查sys.dm_exec_query_stats它可能会帮助您了解发生了什么,因为最有可能包含一行,您可能还希望尝试使用
选项(重新编译)
--假设您的报告没有经常执行,因此重新编译成为一个问题。不幸的是,这不起作用,因为我需要将@county参数传递回SSR,而表变量不能以这种方式工作。也许可以创建另一个临时表而不是表变量。明天早上我得试试这个。