完全なテキストに注文を追加した後、クエリプランがひどく実行されています。検索が含まれます

dba.stackexchange https://dba.stackexchange.com/questions/2966

質問

次のクエリは、私の能力を超えて修正することを証明しています - 誰かが助けることができることを願っています。

SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc

条項別の順序がなければ、クエリは正常に機能します(<2秒)。しかし、注文を追加すると、パフォーマンスはひどい(> 2分)。

問題は誤ったクエリプランのようです。

うまく機能するクエリプランはこれです:enter image description here

ひどく実行するクエリプランはこれです:enter image description here

IX_FOO_INSERTDATEは次のように定義されています。 クラスターインデックスを作成します ix_foo_insertdate オン foo]([insertdate desc )

クエリプランの変更の原因は何ですか?どうすれば修正できますか?

役に立ちましたか?

解決

オプティマイザーは、事前にソートされたものを持っていることの利点を考えているため、異なる計画を選択しています InsertDate (使用 IX_Foo_InsertDate)追加すると、コストを上回ります order by 句。

オプティマイザーは完璧ではありません。統計が正確であっても遅いパスを選択する可能性がありますが、統計が正確でない場合、Auto_create_statisticsとauto_update_statisticsをオンにすると、確かに不十分な選択が行われますか?

必要に応じて、このようなオプティマイザーを「トリック」できるかもしれません。

SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc

どこ some_function_of(InsertDate) と同じ順序を持っています InsertDate

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