0

tblJobscolumn で検索を実装したいテーブルがありますJobDescription。私

このテーブルには 70,000 を超える行があります。私はこれをうまく実装しましたが、私が使った方法は遅すぎます。

誰でもこの問題を解決するのを手伝ってもらえますか? 私が使用しているSQLストアドプロシージャは次のとおりです。

    Create Procedure Sp_SearchJobs
     (
        @SearchValue varchar(Max)
     )
    AS
BEGIN
    WITH SplitTblJobs AS
    (
        SELECT tbljobs.*, s.ListValue FROM tbljobs tbljobs
        CROSS APPLY  dbo.FN_ListToTable(' ',tbljobs.JobDescription) AS s
    )

    , WordMatchCount AS 
              (
      SELECT s.JobID,COUNT(*) AS CountOfWordMatch FROM                         dbo.FN_ListToTable('',@SearchValue) v
      INNER JOIN SplitTblJobs s ON v.ListValue=s.ListValue
      GROUP BY s.JobID
      HAVING COUNT(*)>0
               )
    , SearchLen AS 
    (
      SELECT n.Number,SUBSTRING(@SearchValue,1,n.Number) AS PartialSearchValue
      FROM Numbers n WHERE n.Number<=LEN(@SearchValue)
            )
     , MatchLen AS 
    (
      SELECT tbljobs.JobID,MAX(l.Number) MatchStartLen FROM tbljobs tbljobs
      LEFT OUTER JOIN SearchLen l ON LEFT(tbljobs.JobDescription,l.Number)=l.PartialSearchValue
      GROUP BY tbljobs.JobID
    )
      SELECT  tbljobs.*,w.CountOfWordMatch,m.MatchStartLen FROM tbljobs tbljobs
      LEFT OUTER JOIN WordMatchCount  w ON tbljobs.JobID=w.JobID
      LEFT OUTER JOIN MatchLen        m ON tbljobs.JobID=m.JobID
      WHERE w.CountOfWordMatch>0
      ORDER BY w.CountOfWordMatch DESC,m.MatchStartLen DESC,LEN(tbljobs.JobDescription) 
      DESC,tbljobs.JobDescription ASC
END 

ここの関数には、使用される関数があります。そのテーブル値関数のコードは次のとおりです。

  Create FUNCTION [dbo].[FN_ListToTable]
  (
       @SplitOn  char(1)    
      ,@List   varchar(8000)
  )
  RETURNS TABLE

  AS  RETURN 
  (

    SELECT
      ListValue
    FROM (SELECT
              LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
              FROM (
                       SELECT @SplitOn + @List + @SplitOn AS List2
                   ) AS dt
                  INNER JOIN dbo.Numbers n ON n.Number < LEN(dt.List2)
              WHERE SUBSTRING(List2, number, 1) = @SplitOn
         ) dt2
    WHERE ListValue IS NOT NULL AND ListValue!='');

ここで使用される別のテーブルがあります。その構造は次のとおりです。

   CREATE TABLE [dbo].[Numbers]
   (
     [Number] [int] IDENTITY(1,1) NOT NULL,
         CONSTRAINT [PK_Numbers] PRIMARY KEY CLUSTERED 
         (
           [Number] ASC
         )
         WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
        ON [PRIMARY]
   ) ON [PRIMARY]

   GO

この手順を実行するには..

  1. 上記のテーブルを作成します
  2. メイク機能
  3. ストアド プロシージャを作成します。

の説明欄の検索を実装したいtbljobs

4

2 に答える 2

1

SQL Server を使用していると仮定すると、全文検索を有効にして使用する必要があります。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

于 2012-07-05T07:28:16.627 に答える
0

ここで車輪を再発明しようとしていると思います。単純な部分文字列検索だけが必要な場合は、LIKE 演算子を使用してください。

より高度な検索機能が必要な場合は、全文検索の実行方法について、RDBMS (SQL サーバーを想定しています) のドキュメントを確認してください。

于 2012-07-05T07:29:21.843 に答える