質問

約6-7で結合されたテーブルと、whereのベーステーブルの6列にFREETEXT()述語が付いたクエリがあります。

さて、このクエリは昨年(2秒未満で)正常に機能し、実際には変更されていませんでした(古いバージョンを試しましたが、問題は続きます)

そのため、今日、突然、同じクエリに1〜1.5分かかります。

SQL Server 2005の実行計画を確認した後、そのテーブルのフルテキストインデックスを再構築し、フルテキストインデックスを再編成し、ゼロからインデックスを作成し、SQL Serverサービスを再起動し、他に何を試すべきかわからないサーバー全体を再起動します。

使用するクエリを一時的に切り替えました LIKE 代わりに、これを理解するまで(今は約6秒かかります)。

クエリパフォーマンスアナライザーのクエリを見ると、「FreeText」クエリと「like」クエリを比較すると、前者は350倍の読み取り(4921261対13943)および20回(38937対1938)を持っています。後者のCPU使用。

ですから、それが本当に遅くなるのは「FreeText」予測です。

理由が何であるかについて誰かがアイデアを持っていますか?または私ができるさらなるテスト?

編集

まあ、私は再びクエリを実行して実行計画を取得しましたが、今では問題がまだ存在していましたが、変更は行われずに2〜5秒かかります。先週の木曜日に問題を最初にテストしたときにデータベースにアクセスするすべてのアプリケーションを停止したため、外部要因によるものではありませんでした。

まあ、私はまだ実行計画を含めますが、すべてが再び機能しているので、それはあまり役に立たないかもしれません...そして注意してください、それは私が変更できないレガシーデータベースへの大きなクエリです(つまり、データを正規化したり、取得したりしますいくつかの不変の中間テーブルを取り除く)

クエリプラン

ここにフルがあります クエリ

私はそれが正確に何をするかを説明しなければならないかもしれません。基本的に、ジョブ広告の検索結果を取得します。ここでは、2種類の広告、プレミアムの広告と通常の広告があります。結果は、ページごとに25の結果、10件のプレミアムの結果、その後15のプレミアムの結果、十分な場合は15の結果に異なっています。

したがって、必要に応じてプレミアム/通常のプレミアム/通常のものを選択する2つの内側クエリがあります(たとえば、上位100枚のプレミアムのものとトップ150の通常のものを取得します)、これらの2つのクエリはrow_number()コマンドといくつかの数学でインターリーブされます。その後、組み合わせはRownumberによって注文され、クエリが返されます。まあ、それは現在のページに必要な25広告を取得するために別の場所で使用されています。

ああ、このクエリ全体は巨大なレガシーコールドフュージョンファイルで構築されており、それが正常に動作しているので、私はこれまでに大量の大部分をあえてしていません...ランニングシステムに触れないでください;)中央のビットWhere Where句。

ファイルは、基本的に同じことを行う他のクエリも生成しますが、プレミアム/非プレミアムの区別とこのクエリの他の多くのバリエーションがないため、それらのいずれかの変更が他のものをどのように変えるかはわかりません。 。

問題が再び浮上していないので、私は彼がこれまでで最も役立っていたので、マーティンに賞金を与えました。他の皆さんの努力に感謝します。それが再び起こったらあなたの提案を試してみてください:)

役に立ちましたか?

解決

この問題は、全文クエリによって返される結果の数のカーディナリティの推定が不十分であるために発生する可能性があります。

パフォーマンスを2つのステップに分割した場合、どのようにパフォーマンスを見つけますか?

一時的なテーブルまたはテーブル変数を承認する1つの新しいステップと、フルテキストクエリの結果と2番目のステップは、既存のクエリを変更して、代わりにTEMPテーブルを参照します。

(NB:あなたはこれを有無にかかわらず試してみたいかもしれません OPTION(RECOMPILE) (a)多くの結果を返す無料のテキスト検索用語のクエリ計画を見ている間(b)ほんの一握りの結果を返すもの。)

編集 問題のクエリがない場合に正確に明確にすることは困難ですが、私が意味するのはする代わりに

SELECT <col-list>
FROM --Some 6 table Join
WHERE FREETEXT(...);

これはどのように機能しますか?

DECLARE @Table TABLE
(
<pk-col-list>
)
INSERT INTO @Table
SELECT PK
FROM YourTable
WHERE FREETEXT(...)

SELECT <col-list>
FROM --Some 6 table Join including onto @Table
OPTION(RECOMPILE)

他のヒント

通常、この問題がある場合、問題のインデックス上のテーブルの断片化と古い統計が原因です。

次回は執行してみてください SP_UPDATESTATS 再構築/再インデックスの後。

見る 統計を使用してクエリパフォーマンスを改善します 詳細については。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top