Как я могу увидеть содержимое индекса Oracle? - PullRequest
2 голосов
/ 11 августа 2010

Можно ли взглянуть на то, что внутри индекса, используя SQL * Plus?

Если у меня есть такая таблица:

Table A
------------------------
rowid  |  id   name
123    |  1    A
124    |  4    G
125    |  2    R
126    |  3    P

, где idпервичный ключ, я ожидаю, что индекс будет выглядеть примерно так

index on A.id
-------------
id  rowid
1   123
2   125
3   126
4   124

Есть ли какой-нибудь SQL-запрос, с помощью которого я могу увидеть содержимое индекса?

Ответы [ 2 ]

4 голосов
/ 11 августа 2010

Нет простого запроса - вы можете создать дамп таблицы или индексных блоков для трассировки файлов, но вы должны определить интересующий вас блок. У Дион Чо есть пример того, как вы можете обработать этот блок.Блок дамп с SQL, но это не для слабонервных.

Тем не менее, вы можете сделать это:

select /* index_ffs (a [name of index]) */
       id, rowid 
  from a
 where id is not null
 order by id, rowid;

Oracle не записывает записи индекса, где все значения индексируютсяявляются нулевыми, поэтому, если id обнуляем, мы должны отфильтровать их.Подсказка index_ffs заставляет Oracle выполнить запрос, считывая блоки индекса, а не блоки данных.Это «решение» не показывает данные, которые были бы в корневых или ветвящихся блоках, тогда как дамп блока может.

0 голосов
/ 04 марта 2019

Если вы индексируете EMP_ID - так что все значения из этого конкретного столбца индексируются как листы - например, ASC-индекс B-Tree - на левой стороне листовой части вы должны видеть MIN (indexed_value) или на правом сайте вы должны видеть MAX (indexed_value) - для DESC в противоположность.Но если вы запрашиваете значения BRANCHES / ROOT, я не могу вам помочь - но в целом это не так важно.объяснить план:

select **min**(emp_id) 
from emp
where emp_id < 100;

select **max**(emp_id) 
from emp
where emp_id < 100;

и сравнить его друг с другом ( CARDINALITY 1 ) - он читает только одну строку из объекта IND_EMP_ID

and then explain plan for:
select **min**(employee_id), **max**(employee_id) 
from employees 
where employee_id < 100;

- CARDINALITY 40 - между мин. И макс. Помещаются только 40 различных значений в индексе - все значения из столбца emp_id.

Не забывайте, что даже для PK вы все еще можете использовать B-TREE / BITMAP INDEXУНИКАЛЬНЫЙ или НЕ УНИКАЛЬНЫЙ.

...