Sql Server 2012 Web Edition に基づいて e コマース ショップを運営している Web サイトがあります。データベースは多かれ少なかれ 4GB で、約 20.000 項目が含まれています。このデータベースは「シンプル」に設定されており、サイズが 15MB の全文カタログが含まれています。
サイトを起動して検索しようとすると、FTS を使用したストア プロシージャが 30 秒後にタイムアウトします。この動作は、次の 2 ~ 3 回の検索でも続きます。その後、すべてがスムーズに進み、結果が取得されます。
Web サイトがホストされているサーバーをスケールアップしようとしましたが、何も変わりませんでした。また、サイト データベースを専用のマシンでホストしようとしましたが、改善は見られませんでした。全文カタログの作成スケジュールを設定しようとしましたが、何も変わっていないようです。
検索すると次のようになるため、それが何であるかを本当に理解できません。
- Web サイトは明らかに開始されているため、プロセスが実行されており、AppPool が構成されています
- データベースをオンにする必要があります。最初のページには、データベースから取得した (キャッシュにない場合) 製品がいくつかあるためです。同じサーバーが多かれ少なかれ他の 10 の他の e コマース Web サイトで使用されているため、キャッシュはあまり使用されていないと思います。
- 1〜5回のクエリの後、すべてが一定期間スムーズに進みます
誰にもいくつかのアイデアがありますか?
以下はコードからの抜粋です。
- Web サイトは、ストアド プロシージャを呼び出して検索を開始します。
- ストアド プロシージャは 15 個のパラメーターを取ります。これらの 1 つは、検索されたテキストである Keyword です。
これは、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
その部分は、クエリ テキストに応答する ProductIds を挿入するために使用される一時テーブルを作成します。
- ストアド プロシージャは、他のパラメーターを使用して製品をフィルタリングし、ID が一時テーブルに含まれていないアイテムを削除します。