У меня есть запрос
select a.id,
a.code,
h.history_id
from a
join h
on h.object_id = a.id
and h.level = 'Level1'
and h.class_id in ('class1', 'class2');
И план его выполнения:
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 340 |108889 | 794224 | 00:00:32 |
| *1 | HASH JOIN | | 340 |108889 | 794224 | 00:00:32 |
| 2 | TABLE ACCESS STORAGE FULL | a | 340 | 39314 | 2 | 00:00:01 |
| 3 | PARTITION RANGE ALL | | 274564| 54855 | 69422 | 00:00:32 |
| *4 | TABLE ACCESS STORAGE FULL | h | 274564| 54855 | 69422 | 00:01:14 |
-----------------------------------------------------------------------------------
*1 - access("a"."id" = "h"."object_id")
*4 - storage ("h"."level" = 'Level1' and ("h"."class_id" = 'class1' or "h"."class_id" = 'class2'))
*4 - filter ("h"."level" = 'Level1' and ("h"."class_id" = 'class1' or "h"."class_id" = 'class2'))
Также есть индексы для таблиц - для таблицы a (id) и составного индекса для таблицы h (object_id, level, class_id).Также была собрана статистика.
Таблица a состоит из 340 записей, а таблица h - около 1 миллиарда записей.Запрос результата возвращает около 200 строк
Хотя все столбцы из индекса для таблицы h используются в условии соединения, в плане нет предиката доступа на уровне столбцов и class_id.Я не понимаю это решение.
Я хочу, чтобы уровень доступа был как минимум h.leate.Есть ли какие-то решения для этого?Или какой-то запрос переписать?