首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化替换和查找功能?

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

Stack Overflow用户
提问于 2014-11-06 10:35:34
回答 2查看 772关注 0票数 0

我正在尝试创建函数,它可以用sql中的超链接替换某些单词。当我在sql中以查询的形式调用函数时,执行查询需要花费相当长的时间,超过2-3分钟。我认为这是因为,tag_libary表有大约60万条记录,并且遍历大量的数据,将消耗大量的处理时间。

代码语言:javascript
复制
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、标题、正文)

代码语言:javascript
复制
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)

代码语言:javascript
复制
1,DRYDN33
2,DUCHS
3,DRYDN33
4,DRYDN15
5,EUROC
6,DRYDN15
7,GROSV

因此,我写这封信是为了寻求一些建议,如果有办法使这个sql函数优化,或者将这个函数改为insert触发器会更好吗?

如果可能的话,请提出建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 12:31:43

你的想法,我没有测试它:

将查询更改为以下内容:

代码语言:javascript
复制
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表(而不是类似的操作符),但是它需要额外的代码来维护字典。

票数 1
EN

Stack Overflow用户

发布于 2014-11-06 12:49:09

你把注意力集中在错误的事情上了。问题是,这是一个标量函数,它们执行得很糟糕。您应该将其更改为返回单个行并使用APPLY的表值函数。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26777257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档