2012-11-21 5 views
7

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 

はなく、列がすでにソートされているという理由だけで、事を固定ソート列です。クールなソリューションのようです...

+0

インデックススキャンクラスタ化されたステップの順序 - >ソート - >を選択。あなたが見ているものを選択することは、期待される出力を正確に与える最後のステップです。 (そして、出力をソートする必要があります)そして計画では、「より大きな仕事」は推定であり、ソートではありません。あなたは、実行計画の指示なしでスキャンするために同じインデックスを使用することは確かですか? –

+0

はい、それは同じインデックスを使用しますが、あなたが言及したように、IMPLICIT_CONVERTを使用して文字列を一意の識別子に変換するために、{guid、 'AFCF4921- 31B4-44C1-B3A7-913910F7600E '}。 キャストと変換を使っていくつかのテストを行いました。私は同じ時間を過ごしています。 –

+0

VersionIdは一意のキーですか?または、重複を持つことができますか?それがユニークなら、私はこれがもっと速くなると期待します。 –

答えて

1

まず、私はなぜそれをやっているのかわかりません!それを言って、ここにあなたがすでに試した可能性があるいくつかのことがあります。

  • クエリヒント: はあなたがここに文書化され、様々なクエリヒントのいずれかを使用してみましたか? http://msdn.microsoft.com/en-us/library/ms181714.aspx。特にRECOMPILEオプション。

  • DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERSの通常の手順はどうですか?これらは私が通常試みるものです。

  • 統計情報の更新:データベース全体の統計情報を更新するには、UPDATE STATISTICS tablenameまたはEXEC sp_updatestatsを実行してください。

最後に、そしておそらくあなたのケースでは、関連するが、テーブルの良い説明がありますいないここにヒント:http://blog.sqlauthority.com/2009/11/19/sql-server-understanding-table-hints-with-examples/

+0

悲しいことに、働いている人はいませんし、ヒントでさえ、私が知っている限り、Entity Frameworkにそれらを使用するように指示することはできないと思います。 –

+0

これは非常に奇妙です! EXEC sp_updatestatsを再実行しただけで、正常に動作しません。それが初めて働かなかったのは奇妙です!しかし、それは今働くことが重要です! 助けてくれてありがとう! –

+0

それは奇妙ですが、それは最終的に大丈夫だった涼しいです。最初に動作しないように見える場合は、統計情報を2回更新するようメモを作成します;-) –

関連する問題