我正在尝试创建可以用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函数达到最佳状态,或者将这个函数更改为插入触发器会更好吗?
如果可能,请提供建议。
答案 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。