2014-01-30 1 views
4
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?«ТАБЛИЦА ДОСТУПА ПО ИНДЕКСУ ROWID» означает оптимизатор с использованием индекса или таблицы?

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

+1

Он использует индекс, чтобы получить rowids. – Rachcha

+0

В нем говорится, что он использует индексы Tab1_PK и Tab2_PK. – OldProgrammer

+3

Документация [содержит раздел о понимании плана объяснения] (http://docs.oracle.com/cd/E25054_01/server.1111/e16638/ex_plan.htm#i3305). –

ответ

9

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

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

0

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

  1. ROWID из строки задает блок файла данных и данных, содержащий строки и расположение строки в этом блоке. Локализация строки путем указания ее rowid - это самый быстрый способ получить одну строку, поскольку она указывает точное местоположение строки в базе данных.

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

Смежные вопросы