Левое соединение при отсутствии индекса в соответствии с планом объяснения - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь выполнить приведенный ниже запрос и присоединяюсь к таблицам в поле индекса (hdr.M_KEYID) Тем не менее я вижу полный доступ к таблице в объяснении плана. Подскажите, пожалуйста, где я ошибся и как это можно изменить, чтобы сделать это быстрее

Ниже приведены индексы на каждой таблице

Индексы на MY_H2S

M_KEY0
M_KEY1  

Индексы MY_HBS

M_DATE
M_KEYID
M_DATE

Запрос:

select 
bdy.M_DATE as M_DATE,
M_KEY0 as M_KEY0,
M_KEY1 as M_KEY1 ,
(M_B_F+M_A_F)/2  as M_PRICE,
bdy.M_DATE as M_DATE
from 
MY_H2S hdr left join MY_HBS bdy on hdr.M_KEYID = bdy.M_KEYID

Объяснить план:

 ----------------------------------------------------------------------------------
 | Id  | Operation          | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
 ----------------------------------------------------------------------------------
 |   0 | SELECT STATEMENT   |             |   182K|    12M|   458   (1)| 00:00:06 |
 |*  1 |  HASH JOIN OUTER   |             |   182K|    12M|   458   (1)| 00:00:06 |
 |   2 |   TABLE ACCESS FULL| MY_H2S      |   124 |  3968 |     3   (0)| 00:00:01 |
 |   3 |   TABLE ACCESS FULL| MY_HBS      |   182K|  7288K|   455   (1)| 00:00:06 |
 ----------------------------------------------------------------------------------

Не могли бы вы сообщить mw, где я ошибся и как это можно сделать, чтобы сделать это быстрее

1 Ответ

0 голосов
/ 02 мая 2018

Это слишком долго для комментария.

Лично я бы ожидал, что Oracle будет использовать MY_HBS(M_KEYID) для JOIN. Однако существуют смягчающие обстоятельства:

  • Стол небольшой, умещающийся (предположительно) на одной странице.
  • Индекс не охватывает запрос (вы выбираете другие столбцы).

Оптимизатор учитывает несколько факторов. Линейное сканирование списка из 124 записей не обязательно хуже загрузки индекса, обхода индекса и последующей загрузки (единственной) базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...