0

myDate 列の最小値を持つ行をフェッチしたいと思います。そのために、次のクエリを使用します。

select * from (select * from table where processed = 'N'
order by myDate) 
where rownum = 1;

このクエリを Oracle で O(1) 時間の複雑さにするインデックスを作成することは可能ですか: 処理されていない行から最初の行を選択し、日付を最小限に抑えます (2 つの部分に分割された btree インデックスのようなもの)。processed列は値「Y」または「N」のみを持つことができます)。

4

1 に答える 1

2

はい、(myDate、処理済み) のインデックスを使用すると、1 つの行を直接取得できます。O(1) ではありませんが (btree はそれを提供しません)、完全なテーブル スキャンの O(n) よりもはるかに優れています。

そのインデックスの列の順序は重要です。通常、最初に myDate で並べ替え、そのスイッチ内でそのフラグで並べ替えます (ただし、以下を参照してください)。

また、「最初の」(myDate 順) 数千のエントリすべてprocessed=Yにインデックス スキャンがある場合、それらすべてをスキップするのに (少し) 時間がかかることに注意してください (テーブルに移動するのではなく、インデックス内)。これがすべてのエントリに適用される場合、最悪の場合でも O(n) になります (完全なインデックス スキャンになります)。

それが問題になる場合は、インデックス列の順序を (処理済み、myDate) に切り替えることができます。次に、Y 用と N 用に 1 つずつ、合計 2 つの B ツリー インデックスを効果的に作成します。

于 2013-04-14T23:55:56.060 に答える