dlaczego blevel ma wartość null dla niektórych indeksów w Oracle DB?

Próbowałem zobaczyć poziomy b-drzewa dla indeksów i ku mojemu zdziwieniu widzę, że niektóre z nich są ustawione na zero.

SELECT index_name, blevel FROM user_indexes ORDER BY 2 desc; 

Ich nazwa zaczyna się od „SYS _” (zdjęcie załączone poniżej). Więc zakładam, że są to indeksy generowane przez system? Może kluczy głównych? Tak czy inaczej, jestem ciekawy, dlaczego są one nieważne. Rozumiem, jeśli wartość wynosi 0, co oznacza, że wszystko znajduje się w węzłach liści, a unikalne skanowanie w celu uzyskania danych zajmie tylko 1 skok.

tutaj wprowadź opis obrazu

Komentarze

  • Wyglądają jak obiekty schematu sys, więc mogą grać według własnych zasad. Ale najbardziej prawdopodobną odpowiedzią jest to, że w ogóle nie ma w nich węzłów.
  • W przypadku kilku kolumn statystyk (w tym blevel) w *_indexes dokumentach jest napisane " Nazwy kolumn zakończone gwiazdką są zapełniane tylko wtedy, gdy zbierasz statystyki indeksu za pomocą instrukcji ANALIZA lub pakietu DBMS_STATS. " Wydaje mi się, że silnik nie ' nie wykonuje żadnego z tych poleceń względem niektórych lub wszystkich indeksów tabel systemowych …
  • To są indeksy lobów, może to być tylko własność indeksów lobów. Możesz spróbować je zebrać, ale nie jestem pewien, co Oracle zrobiłaby wewnętrznie.

Odpowiedź

Indeksy, których nazwa zaczyna się od SYS_IL.. to indeksy LOB.

BLEVEL jest właściwością indeksów B-drzew i nie ma sens dla indeksów LOB.

Nawet jeśli zbierasz statystyki, BLEVEL dla takiego indeksu pozostanie zerowe.

Odpowiedź

Dzięki @Balazs za informacje.

Zbadałem to i wygląda następująco –

Lob jest po prostu wskaźnikiem i wskazuje na fragmenty danych, które tworzą ten lob. Więc kiedy tworzysz kolumnę lob, automatycznie uzyskujesz indeks lob, dzięki czemu fragmenty danych lob są pobierane szybciej i segment, który przechowuje te fragmenty danych.

Użyj następujących zapytań, aby to sprawdzić –

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

Aby zobaczyć powiązane segmenty –

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%%" ); 

Możesz to usunąć, upuszczając tabelę, która ma kolumnę lob lub samą kolumnę.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *