Sql 慢速存储过程和函数

Sql 慢速存储过程和函数,sql,sql-server,Sql,Sql Server,我将aaa、bbb、ccc传递到存储过程SearchNewsByTag的@Tag,它需要选择至少有一个类似关键字的所有新闻项(比如“aaa”或“bbb”或“ccc”…) 一切正常,但速度相当慢,通常需要5秒钟才能完成。新闻表只有大约110k条记录。它运行太慢,有些地方不对劲。你检查过执行计划了吗?@christiandev我不知道,谢谢你的建议,我可以学到一些新东西。@namvo,看看这里:如果你使用的是SQL Server 2008或更新版本(你没有说),你应该检查一下该功能(而不是传入逗号分

我将
aaa、bbb、ccc
传递到存储过程
SearchNewsByTag
@Tag
,它需要选择至少有一个类似关键字的所有新闻项(比如“aaa”或“bbb”或“ccc”…)


一切正常,但速度相当慢,通常需要5秒钟才能完成。新闻表只有大约110k条记录。

它运行太慢,有些地方不对劲。你检查过执行计划了吗?@christiandev我不知道,谢谢你的建议,我可以学到一些新东西。@namvo,看看这里:如果你使用的是SQL Server 2008或更新版本(你没有说),你应该检查一下该功能(而不是传入逗号分隔的字符串,然后将其解析出来)
ALTER PROCEDURE [dbo].[SearchNewsByTag]
    (@PageIndex         int = 0, 
     @PageSize          int = 2147483644,
     @Tag               nvarchar(400) = null,   
     @TotalRecords      int = null OUTPUT)
AS
BEGIN
    DECLARE @PageLowerBound int
    DECLARE @PageUpperBound int 

    SET @PageLowerBound = @PageSize * @PageIndex
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1

    declare @FilteredTags as TagTable

    INSERT INTO @FilteredTags (Tag)
        SELECT data 
        FROM dbo.nop_splitstring_to_table(@Tag, ',')    -- split the input Tag into separate keywords

    SELECT * 
    FROM
        (SELECT 
             ROW_NUMBER() OVER (ORDER BY id) AS RowNum, *  
         FROM News n
         WHERE dbo.HasSimilarTag(@FilteredTags,n.Tags) > 0) p    -- pass the table with a news tag to check 
    WHERE 
        [p].RowNum > @PageLowerBound AND [p].RowNum < @PageUpperBound
ALTER FUNCTION [dbo].[HasSimilarTag]
    (@Tags TagTable READONLY, @TagFromRecord nvarchar(10) = null)
RETURNS int
AS
BEGIN
    DECLARE @name int

    declare @TagsFromRecord as TagTable
    INSERT INTO @TagsFromRecord (Tag)
    SELECT data FROM [nop_splitstring_to_table](dbo.RemoveDauTVCLR(@TagFromRecord), ',')    

    declare @TagsResult as TagTable
    INSERT INTO @TagsResult (Tag)
    SELECT Tag FROM @Tags intersect SELECT Tag from @TagsFromRecord   

    select @name= COUNT(1) from @TagsResult
    RETURN @name
END