Означает ли TABLE ACCESS BY INDEX ROWID оптимизатор, использующий индекс или таблицу?

I have query that join two very big tables and ran explain plan on that it showing like this..



      ----------------------------------------------------------------------------------------------------------------
        | Id  | Operation                        | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
        ----------------------------------------------------------------------------------------------------------------
        |   0 | SELECT STATEMENT                 |                             |     1 |    31 |     7   (0)| 00:00:01 |
        |   1 |  PX COORDINATOR                  |                             |       |       |            |          |
        |   2 |   PX SEND QC (RANDOM)            | :TQ10000                    |       |       |            |          |
        |   3 |    NESTED LOOPS                  |                             |       |       |            |          |
        |   4 |     NESTED LOOPS                 |                             |     1 |    31 |     7   (0)| 00:00:01 |
        |   5 |      PX PARTITION HASH ALL       |                             |     1 |    17 |     5   (0)| 00:00:01 |
        |   6 |       TABLE ACCESS BY INDEX ROWID| Tab1                        |     1 |    17 |     5   (0)| 00:00:01 |
        |*  7 |        INDEX RANGE SCAN          | Tab1_PK                     |     1 |       |     4   (0)| 00:00:01 |
        |*  8 |      INDEX UNIQUE SCAN           | tab2_PK                     |     1 |       |     1   (0)| 00:00:01 |
        |*  9 |     TABLE ACCESS BY INDEX ROWID  | Tab2                        |     1 |    14 |     2   (0)| 00:00:01 |
        ----------------------------------------------------------------------------------------------------------------


Query:

select t2.colC,t2,colD,t1.colX
from tab2 t2
join tab1 t1 on t2.colA=t1.colA
and t1.colB=2345
and t2.colC in (123,456,789);

Означает ли TABLE ACCESS BY INDEX ROWID, что оптимизатор обращается к rowid в индексе или сканирует таблицу, чтобы получить rowids?

В настоящее время запрос завершается через несколько секунд. Но в плане сказано, что индекс не используется, обе таблицы имеют соответствующие индексы.


person user3225011    schedule 30.01.2014    source источник
comment
Он использует индекс для получения идентификаторов строк.   -  person Rachcha    schedule 30.01.2014
comment
Он говорит, что использует индексы Tab1_PK и Tab2_PK.   -  person OldProgrammer    schedule 30.01.2014


Ответы (2)


TABLE ACCESS BY INDEX ROWID означает, что ядро ​​Oracle просматривает ваш индекс и знает, что не вся необходимая информация содержится в индексе (нужных столбцов в этом индексе нет). Поэтому он берет указатель на фактические данные таблицы (rowid) и ищет их.

Популярный трюк для ускорения работы в данном случае — включение отсутствующих столбцов в (неуникальный) индекс. Это позволяет избежать одного поиска в таблице за счет больших индексов.

person Guido Leenders    schedule 01.02.2014

ДОСТУП К ТАБЛИЦАМ ПО INDEX ROWID — мы должны знать две вещи об этом

  1. Идентификатор строки указывает файл данных и блок данных, содержащий строку, и расположение строки в этом блоке. Поиск строки по ее идентификатору строки — это самый быстрый способ получить одну строку, поскольку он указывает точное местоположение строки в базе данных.

  2. Поиск в индексе — это быстрая и эффективная операция для Oracle, и когда Oracle находит нужное значение, которое он ищет, он также может узнать идентификатор строки записи в какой-либо другой таблице. Затем Oracle может использовать этот идентификатор строки для получения дополнительной информации, если она запрашивается в запросе.

person Motilal    schedule 04.07.2017