Часть 1, Введение : http://exadata-dba.blogspot.com/2021/11/in-memoryoracle.html
Часть 2, IM Scan: http://exadata-dba.blogspot.com/2021/11/in-memoryoracle_22.html
Часть 3:
In-Memory Join
Зависимости таблиц в схеме Swingbench:
Для демонстрации IM Join напишем SQL-запрос, который обращается к двум большим таблицам: ORDER_ITEM = 22 млн строк и ORDERS = 4,6 млн строк. Обе таблицы помещены в IM-пул.
Включим set autot traceonly –вывод плана запроса и статистик и подавление вывода результатов запроса на экран.
select /*+
NO_INMEMORY NO_VECTOR_TRANSFORM
TEST_JOIN_1 */
o.order_id,
oi.quantity * oi.unit_price
from orders
o, order_items oi
where
o.order_id=oi.order_id
and
oi.condition='New' -- New Used Return
and
oi.product_id in (500,600)
and
o.order_mode='online'
and
o.order_status in (1,2,3)
and
o.warehouse_id between 333 and 444;
Первый запрос выполним с IM:
Для сравнения такой же запрос без IM:
In-Memory Join Group
Функционально IM Join Group похоже на Bitmap Join Index: это предварительно создаваемая структура в памяти, которая ускоряет выполнение соединений. Выполним эталонный запрос, когда Join Group ещё не созданы:
select /*+
TEST_JOIN_GROUP_1 */
o.order_id,
oi.quantity * oi.unit_price
where o.order_id=oi.order_id
and oi.condition='New' -- New Used Return
and oi.product_id in (500,600)
and o.order_mode='online'
and o.order_status in (1,2,3)
and o.warehouse_id between 333 and 444;
Видим “13 CPU used by this session”.
Создадим Join Group:
create inmemory join group JG1 ( soe.orders(order_id), soe.order_items(order_id) );
Внимание: создание IM Join Group инвалидирует CU для таблиц, которые участвуют в этой группе, что вызывает последующую репопуляцию этих таблиц (пересоздание Compression Unit). Поэтому дождитесь окончания популяции таблиц в IM.
Повторим тот же самый запрос:
Видим 6 вместо 13.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.