0

24個のテーブル(1つを除くすべてが左外部結合)と83列を結合するビューがあります。order by句なしでビューから*を選択すると、約4:27秒ですべての列に27k行が返されます。同じ選択を行ったが、'order by requestId'句を追加した場合、完了するまでに83分かかります。順序付けされている列は、元のテーブルでインデックスが付けられます。

requestIdによるSelect*from(.......)の順序でラップしようとしましたが、同じ結果が得られます。

どこを見るべきかについての提案

4

2 に答える 2

0

Explain は、時間があれば詳しく教えてくれるかもしれませんが、余分な並べ替えを避けるための便利な順序付きインデックスが見つからないため、27,000 行すべてを完全に並べ替えていると思います。

あなたが持っているものの中で見つけるのは難しいでしょうが、簡単なシナリオは

TableA KeyColumn,DataColumn (キー列は主キー)

Select * From TableA Order By KeyColumn、順序どおりの PK インデックスを使用するため、並べ替えは必要ありません。

select * From TableA Order By DataColumn、テーブルを読み取り、並べ替えを行います。

Datacolumn のインデックスを追加すると、並べ替えは不要になります。

より複雑なシナリオに到達するとすぐに、順序付けに役立つインデックスがあるかもしれませんが、結合には最適ではないため、結合が高速に行われ、順序付けに常に時間が費やされます。

私がこれを見ていて、何をすべきかが思い浮かびませんでした。requestid のインデックスがまったくない場合は、望ましくない動作が発生しなくなるまで、クエリからテーブルを切り出し始めます。次に、元に戻すために元に戻してから、この困難explainではないクエリを使用して、有用なインデックスを取得できるかどうかを確認するか、クエリを言い換えて、より有用なインデックスを使用できるかどうかを確認します。

幸運を祈ります。

于 2012-07-06T13:30:02.640 に答える
0

列に order by がある場合、その列は次のいずれかの一部である必要があります。 - その列のみが存在する独自のインデックス - または、WHERE 句のフィールドと ORDER BY のフィールドを持つインデックス内正確な順序で句。

クエリを見せてくれれば最高です。それから私はあなたとブレインストーミングすることができます。

于 2012-07-09T14:27:37.323 に答える