我正在尝试创建函数,它可以用sql中的超链接替换某些单词。当我在sql中以查询的形式调用函数时,执行查询需要花费相当长的时间,超过2-3分钟。我认为这是因为,tag_libary表有大约60万条记录,并且遍历大量的数据,将消耗大量的处理时间。
CREATE FUNCTION dbo.ReplaceTags(@body VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
SELECT @body = REPLACE(@body,name,'<a href="pagename.aspx?tag='+name+'">'+name+'</a>')
FROM Tag_Library
RETURN @body
END文章表 (id、标题、正文)
1, Story1, At the same time there is a list consisting of: DUCHS, EUROC, GLSPE and WODST. Only two of the tags have covered with the prices in the last three months - GROSV at 99.11 on 8 October and JUBIL at 0s on 11 September.tag_library表 (id,name)
1,DRYDN33
2,DUCHS
3,DRYDN33
4,DRYDN15
5,EUROC
6,DRYDN15
7,GROSV因此,我写这封信是为了寻求一些建议,如果有办法使这个sql函数优化,或者将这个函数改为insert触发器会更好吗?
如果可能的话,请提出建议。
发布于 2014-11-06 12:31:43
你的想法,我没有测试它:
将查询更改为以下内容:
SELECT
@body = REPLACE(@body,name,'<a href="pagename.aspx?tag='+name+'">'+name+'</a>')
FROM
Tag_Library
WHERE
@body LIKE '%' + name + '%'这应该将Tag_Library表过滤到那些存在于输入字符串中的记录,并且Server不必处理大量不必要的记录(替换)。但是,它不会阻止做一个full table / index scan来检查表!
您可以通过在每个项目的表中存储所需的标记来改进此解决方案(并在更改源记录/表时通过触发器更新该表)。在这种情况下,您可以使用联接来过滤Tag_Library表(而不是类似的操作符),但是它需要额外的代码来维护字典。
发布于 2014-11-06 12:49:09
你把注意力集中在错误的事情上了。问题是,这是一个标量函数,它们执行得很糟糕。您应该将其更改为返回单个行并使用APPLY的表值函数。
参见,例如:http://dataeducation.com/scalar-functions-inlining-and-performance-an-entertaining-title-for-a-boring-post/
https://stackoverflow.com/questions/26777257
复制相似问题