2017-02-28 95 views
0

我有一个SSRS报告,将一串县传递给存储过程。由于我不得不构建报告,我需要为县附加36个字符的GUID。我然后使用子串函数剥离GUID在存储过程:Substring函数有更快的替代吗?

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

报告运行在约8秒,这是在REPLACE函数的巨大改进。但我仍然希望让这个跑得更快。有谁知道更好的方法来做到这一点?我不允许在表格中包含索引,所以这不是一个选项。

+0

看看这里http://stackoverflow.com/questions/3828374/relative-performance-in-sqlserver-of-substring-vs-a-right-left-combo。 –

+0

如果子字符串确实是问题,听起来很奇怪。你确定这不是fnsplit导致你的问题?你应该真的包含整个语句,查询计划,因为这是一个函数,所以最好还要查看计划缓存中的性能统计信息。 –

+0

fnsplit在三个不同的变量上运行,但运行速度非常快。只有当我添加了substring()时,它才放慢了速度。当我查看函数的执行计划时,它只显示两个表格插入的成本为50%。有没有一种好的方法来查看变量的统计信息?我只能在运行执行计划时插入一条记录来代替变量。 – jackstraw22

回答

0

如果你先将它加载到一个表变量中,那么内连接,你可能会最大化你的速度。

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] 
+1

由于最可能估计包含1行,因此您可能还想尝试'option(recompile)'发生的情况 - 假设您的报告不经常执行,重新编译就成为问题。 –

+0

不幸的是,这不起作用,因为我需要将@county参数传递回SSRS,并且表变量不以这种方式工作。也许创建另一个临时表而不是表变量会起作用。我必须在早上尝试。 – jackstraw22

+0

我又坏了。它确实有效。 – jackstraw22