0

変数 @Searchtext で渡された検索文字列内で、「EmailKeywords」という名前のテーブルに格納されているいくつかのキーワードの出現を探しています。これは、以下に記述されたストアド プロシージャによって実現されましたが、通常は正常に動作します。しかし、検索するキーワードが多いと、すべてのキーワードで検索テキストをループする必要があるため、これにはかなりの時間がかかります。

この検索を高速化する方法を知っている人はいますか? どんなヒントでも大歓迎です。


ALTER PROCEDURE BodyTextLookForKeywords 

    @Searchtext ntext

AS

DECLARE @Found int = 0
DECLARE @Keyword nvarchar(30)

-- Loop through all the listed key words
DECLARE SearchCursor Cursor For SELECT Searchword from EmailKeywords For Read Only

Open SearchCursor
While (0=0) Begin
    Fetch Next
        From SearchCursor
        Into @Keyword
    If (@@Fetch_Status <> 0) 
        Break
    Else
        Begin
            Set @Found = (SELECT PATINDEX('%' + @Keyword+ '%', @Searchtext))
            If @Found > 0 Break
        End
    End
Close SearchCursor
Deallocate SearchCursor

If @Found=0 select 0 as SResult else select 1 as SResult 
4

2 に答える 2

1

カーソルなしで同じことができる場合は、カーソルの使用を避ける必要があります。それは遅いです、それは反復的な解決策です。あなたの場合、テーブルから直接選択できるので、ここではカーソルは必要ありません

IF EXISTS(SELECT * FROM EmailKeyword
WHERE PATINDEX('%' + Searchword + '%', @Searchtext)) > 1)
SELECT 1 as SResult ELSE SELECT 0 as SResult 
于 2015-01-14T14:38:26.657 に答える
0

ストアド プロシージャの本体を次のように減らすことができます。

SELECT @Found = COUNT(*)
FROM EmailKeywords
WHERE PATINDEX('%' + Searchword + '%', @Searchtext) > 0;

SELECT CASE WHEN @Found > 0 THEN 1 ELSE 0 END AS Result;
于 2015-01-14T14:39:15.997 に答える