1

私が何かをしようとすると

SELECT Max(ObjectId) FROM Objects;

Explain-planで、これはソートを実行することによって実行されることがわかります。さて、ソート(の複雑さで何かが必要になると思いますO(nlogn))は、各行をスキャンして最大値を記憶する(で実行できるO(n))よりもはるかにコストがかかる必要があります。

ここで何かが足りませんか?オラクルは実際にソートを実行していますか、それともexplain-planはObjectId列のすべての値の単純なスキャンを記述するために「sort」という記述を使用していますか?オラクルが実際に「実際のソート」を実行する場合、これを実行する正当な理由がありますか?

前もって感謝します!

4

1 に答える 1

5

あなたはあなたのテーブルについての詳細を投稿していないので、Objects私たちは推測しなければなりません。私の推測では、ObjectIdにインデックスがあります。その場合、ExplainPlanにINDEXFULL SCAN(MIN / MAX)ステップが表示されます。これは、データがインデックスから直接取得されることを意味します。キーはインデックスで並べられているため、最初または最後のキーを読み取ると、最小/最大がわかります。

これはO(log n)操作です(インデックスの深さに依存するため)。

アップデート:

ObjectIdにインデックスがない場合は、ExplainプランにSORTAGGREGATEステップが表示されます。これは、セット全体がソートされるという意味ではありません。実際、データは読み取られるときに集計されます。これには、行ごとに1つの比較が含まれる可能性が高く、合計O(n)コストが得られます。

また、関連する注意点として、OracleはおそらくO(n)アルゴリズムを使用してデータをソートします。

于 2010-03-05T10:36:28.407 に答える