Monday, November 22, 2021

In-Memory@Oracle. Part 3: IM JOIN

Часть 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

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;

Видим “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.

Does DEALLOCATE UNUSED or SHRINK SPACE will free space occupied by LOB segment?

Lets check how it works. My env is DB 19.20@Linux-x64 1) I created the table with 4 LOB columns of 4 different LOB types: BASICFILE BLOB, BA...