如何优化替换和查找功能?

时间:2014-11-06 10:35:34

标签: sql-server tsql

我正在尝试创建可以用sql中的超链接替换某些单词的函数。当我在sql中将该函数作为查询调用时,执行查询需要很长时间,超过2-3分钟。我假设这是因为,tag_libary表有大约600,000条记录并且迭代大量,会消耗大量的处理时间。

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函数达到最佳状态,或者将这个函数更改为插入触发器会更好吗?

如果可能,请提供建议。

2 个答案:

答案 0 :(得分:1)

一想到,我没有测试它:

将您的查询更改为:

SELECT
  @body = REPLACE(@body,name,'<a href="pagename.aspx?tag='+name+'">'+name+'</a>')
FROM
  Tag_Library
WHERE
  @body LIKE '%' + name + '%'

这应该将Tag_Library表过滤到输入字符串中存在的那些记录,并且SQL Server不必处理大量不必要的记录(替换)。 但是这不会妨碍full table / index scan检查表格!

您可以通过在每个文章的表中存储所需的标记来改进此解决方案(并在更改源记录/表时通过触发器更新该表)。在这种情况下,您可以使用连接来过滤Tag_Library表(而不是LIKE运算符),但它需要额外的代码来维护字典。

答案 1 :(得分:0)

你专注于错误的事情。问题是这是一个标量函数,它们表现得很糟糕。您应该将其更改为表值函数,该函数返回单行并使用APPLY。

参见: http://dataeducation.com/scalar-functions-inlining-and-performance-an-entertaining-title-for-a-boring-post/