0

Sql Server 2012 Web Edition に基づいて e コマース ショップを運営している Web サイトがあります。データベースは多かれ少なかれ 4GB で、約 20.000 項目が含まれています。このデータベースは「シンプル」に設定されており、サイズが 15MB の全文カタログが含まれています。

サイトを起動して検索しようとすると、FTS を使用したスト​​ア プロシージャが 30 秒後にタイムアウトします。この動作は、次の 2 ~ 3 回の検索でも続きます。その後、すべてがスムーズに進み、結果が取得されます。

Web サイトがホストされているサーバーをスケールアップしようとしましたが、何も変わりませんでした。また、サイト データベースを専用のマシンでホストしようとしましたが、改善は見られませんでした。全文カタログの作成スケジュールを設定しようとしましたが、何も変わっていないようです。

検索すると次のようになるため、それが何であるかを本当に理解できません。

  1. Web サイトは明らかに開始されているため、プロセスが実行されており、AppPool が構成されています
  2. データベースをオンにする必要があります。最初のページには、データベースから取得した (キャッシュにない場合) 製品がいくつかあるためです。同じサーバーが多かれ少なかれ他の 10 の他の e コマース Web サイトで使用されているため、キャッシュはあまり使用されていないと思います。
  3. 1〜5回のクエリの後、すべてが一定期間スムーズに進みます

誰にもいくつかのアイデアがありますか?

以下はコードからの抜粋です。

  1. Web サイトは、ストアド プロシージャを呼び出して検索を開始します。
  2. ストアド プロシージャは 15 個のパラメーターを取ります。これらの 1 つは、検索されたテキストである Keyword です。
  3. これは、Keyword が null でなく、DB にフル テキスト カタログがある場合に、ストアド プロシージャが実際の開始時に行うことです。

    CREATE TABLE #ProductFullTextSearch ([ProductID] int NOT NULL)  
    SET @Keywords = isnull(@Keywords, '""')
    IF(@Keywords = '') SET @Keywords = '""'
    IF (@Keywords <> '""')
    BEGIN
    IF(@SearchExact = 1) 
    SET @Keywords = '"*' + @Keywords +'*"'
    ELSE 
    SET @Keywords = '"*' + REPLACE(@Keywords, ' ', '*" AND "*') +'*"'
    PRINT @Keywords
    
    INSERT INTO #ProductFullTextSearch(ProductID)
    SELECT p.ProductID
    FROM Nop_Product p with (NOLOCK) 
    LEFT OUTER JOIN Nop_ProductVariant pv with (NOLOCK) ON p.ProductID = pv.ProductID
    WHERE 
    p.Deleted = 0 AND ((CONTAINS((p.name), @Keywords))
    or (@SearchDescriptions = 1 and CONTAINS((p.ShortDescription, p.FullDescription), @Keywords))
    )
    
    INSERT INTO #ProductFullTextSearch(ProductID)
    SELECT p.ProductID
    FROM Nop_Product p with (NOLOCK) 
    LEFT OUTER JOIN Nop_ProductVariant pv with (NOLOCK) ON p.ProductID = pv.ProductID
    WHERE 
    p.Deleted = 0 AND ((CONTAINS((pv.name, pv.SKU), @Keywords))
    or (@SearchDescriptions = 1 and CONTAINS(pv.Description, @Keywords))
    )
    END
    
  4. その部分は、クエリ テキストに応答する ProductIds を挿入するために使用される一時テーブルを作成します。

  5. ストアド プロシージャは、他のパラメーターを使用して製品をフィルタリングし、ID が一時テーブルに含まれていないアイテムを削除します。
4

1 に答える 1

0

観察された動作は、FTS プロシージャによって参照される 1 つ以上のテーブルでインデックスが欠落している可能性が非常に高いです。インデックスが欠落している場合、Sql Server は関連するストアド プロシージャの最初の呼び出し時に独自の内部インデックスを作成するため、最初の遅延が発生します。この遅延を回避するには、不足しているインデックスを自分で作成する必要があります。

次の手順を実行します:

  1. SQL Server プロファイラーを実行し、アプリによって最初に実行されるパラメーターを使用して正確なストアド プロシージャ テキストをキャプチャします。
  2. SQL Server Management Studio で DB に接続し、[実際の実行プランを含める] ボタンを押して、クエリを手動で実行します。
  3. [結果] ウィンドウで [実行計画] タブに切り替え、サーバーから報告された不足しているインデックスがあるかどうかを確認します。
  4. インデックスの説明をコピーして DB に永続的に作成する以外に、欠落しているインデックスがある場合。

Note, I'm talking about missing plain/normal non-clustered table index and not FTS index/catalog.

PS. Sorry for the delayed reply, but I'm having FTS searching performance issues myself so just found your unanswered question. Though my problems are not related to a missing index.

于 2016-09-23T14:59:43.030 に答える