OracleDBの一部のインデックスでblevelがnullになるのはなぜですか。

インデックスのBツリーレベルを確認しようとしましたが、驚いたことに、一部がnullに設定されていることがわかりました。

SELECT index_name, blevel FROM user_indexes ORDER BY 2 desc; 

名前は「SYS_」で始まります(下の写真を添付)。だから私はそれらがシステム生成インデックスであると仮定していますか?多分主キーの?どちらの方法でも、なぜそれらがnullであるのかについて興味があります。値が0であるかどうかは理解できます。つまり、すべてがリーフノードにあり、一意のスキャンでデータを取得するのに1ホップしかかかりません。

ここに画像の説明を入力

コメント

  • これらはsysスキーマオブジェクトのように見えるため、独自のルールでプレイするかもしれません。しかし、最も可能性の高い答えは、ノードがまったくないことです。
  • *_indexesドキュメントのかなりの数の統計列(blevelを含む)について、"列名の後にアスタリスクが続く場合は、ANALYZEステートメントまたはDBMS_STATSパッケージを使用してインデックスの統計を収集する場合にのみ入力されます。 "エンジンは'一部またはすべてのシステムテーブルインデックスに対してこれらのコマンドのいずれも実行しないと思います…
  • これらはlobインデックスであり、lobインデックスのプロパティである可能性があります。それらを収集してみることができますが、オラクルが内部で何をするかわかりません。

回答

インデックスのSYS_IL..で始まる名前はLOBインデックスです。

BLEVELはBツリーインデックスのプロパティであり、そうではありません。 LOBインデックスには意味があります。

統計を収集しても、そのようなインデックスのBLEVELはnullのままです。

回答

情報を提供してくれた@Balazsに感謝します。

これについて調査したところ、次のようになりました-

lobは単なるポインタであり、そのlobを作成するデータチャンクを指します。したがって、lob列を作成すると、自動的にlobインデックスが取得されるため、lobデータチャンクがより高速に取得され、このデータチャンクを保持するセグメントが生成されます。

次のクエリを使用して同じことを確認します-

SELECT index_name,INDEX_TYPE, blevel FROM user_indexes where blevel is null and index_name like "SYS_IL%%" ORDER BY 3 desc; 

関連するセグメントを表示するには-

select segment_name, segment_type, tablespace_name, bytes, max_extents from user_segments where segment_name in ( SELECT index_name FROM user_indexes where blevel is null and index_name like "SYS_IL%%" ); 

これを削除するには、lob列または列自体。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です