完全なテキストに注文を追加した後、クエリプランがひどく実行されています。検索が含まれます
-
16-10-2019 - |
質問
次のクエリは、私の能力を超えて修正することを証明しています - 誰かが助けることができることを願っています。
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
条項別の順序がなければ、クエリは正常に機能します(<2秒)。しかし、注文を追加すると、パフォーマンスはひどい(> 2分)。
問題は誤ったクエリプランのようです。
うまく機能するクエリプランはこれです:
ひどく実行するクエリプランはこれです:
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
所属していません dba.stackexchange