我想在优化以下查询一些帮助:优化使用函数的SQL Server存储过程?
SELECT DISTINCT TOP (@NumberOfResultsRequested) dbo.FilterRecentSearchesTitles(OriginalSearchTerm) AS SearchTerms
FROM UserSearches
WHERE WebsiteID = @WebsiteID
AND LEN(OriginalSearchTerm) > 20
--AND dbo.FilterRecentSearchesTitles(OriginalSearchTerm) NOT IN (SELECT KeywordUrl FROM PopularSearchesBaseline WHERE WebsiteID = @WebsiteID)
GROUP BY OriginalSearchTerm, GeoID
运行没有被注释掉行罚款。我在UserSearches.OriginalSearchTerm,WebsiteID和PopularSearchesBaseline.KeywordUrl上设置了一个索引,但查询仍然在此处运行缓慢。
- UPDATE - 使用的功能如下:
ALTER FUNCTION [dbo].[FilterRecentSearchesTitles]
(
@SearchTerm VARCHAR(512)
)
RETURNS VARCHAR(512)
AS
BEGIN
DECLARE @Ret VARCHAR(512)
SET @Ret = dbo.RegexReplace('[0-9]', '', REPLACE(@SearchTerm, '__s', ''), 1, 1)
SET @Ret = dbo.RegexReplace('\.', '', @Ret, 1, 1)
SET @Ret = dbo.RegexReplace('\s{2,}', ' ', @Ret, 1, 1)
SET @Ret = dbo.RegexReplace('\sv\s', ' ', @Ret, 1, 1)
RETURN(@Ret)
END
使用Reglar Expression Workbench代码。
但是,正如我所提到的 - 没有当前注释的行,它运行良好。
其他建议?
删除该功能。或者向我们展示该功能的功能。如果它对源查询中的每一行都进行数据访问,我认为我们发现了您的问题。考虑将它重写为一个表值函数,然后SQL Server有一些机会来优化它。 – 2012-07-25 19:38:47