SQL Server 2005データベースのパフォーマンスの発注に問題があります。このクエリは、7行を返すと実行に約23秒かかりますSQL Server 2005でテーブル全体を処理するインデックススキャンの前にソート
select
id, versionId, orderIndex
from Forms_Page
where
versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E'
order by
orderIndex
: は、私は次のクエリを考えてみましょう。
select(コスト:0%)→ソート(コスト:11%)→クラスタインデックススキャン(コスト:89%)このクエリの実行計画は次のとおりです(画像をまだ投稿できません)
'order by'句を削除した場合、クエリは予想どおり〜4ミリ秒で完了します。
要求された行を取得する前にSQL Serverがソートを実行するのはなぜですか?それは私には意味がありません。なぜ7行を最初に取得し、それらをソートしないのですか?私はデータベース構成のような何かを見逃していますか?これは予期された動作ですか?
私は、以下のような内部選択を使用して、エンジンに最初に行を取得させてから、6ms後に行を返すように強制することができましたが、EFを使用しているので、 (私たちはメモリ内の結果をソートすることができましたが、ソート付きのSQLコードを生成するエンティティのいくつかにLoadWithオプションを使用しています。また、そのコードは同じ 'order by'問題を抱えています)。私はいくつかのインデックス作成をテストしている
select *
from(
select
id, versionId, orderIndex
from Forms_Page
where
versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E'
) T
order by
T.orderIndex
はなく、列がすでにソートされているという理由だけで、事を固定ソート列です。クールなソリューションのようです...
インデックススキャンクラスタ化されたステップの順序 - >ソート - >を選択。あなたが見ているものを選択することは、期待される出力を正確に与える最後のステップです。 (そして、出力をソートする必要があります)そして計画では、「より大きな仕事」は推定であり、ソートではありません。あなたは、実行計画の指示なしでスキャンするために同じインデックスを使用することは確かですか? –
はい、それは同じインデックスを使用しますが、あなたが言及したように、IMPLICIT_CONVERTを使用して文字列を一意の識別子に変換するために、{guid、 'AFCF4921- 31B4-44C1-B3A7-913910F7600E '}。 キャストと変換を使っていくつかのテストを行いました。私は同じ時間を過ごしています。 –
VersionIdは一意のキーですか?または、重複を持つことができますか?それがユニークなら、私はこれがもっと速くなると期待します。 –