[ora] оптимизация
От: Funny Rabbit Россия  
Дата: 03.04.25 14:33
Оценка:
select s.sale_id,
s.costumer_id,
s.retailer_id,
p.product_name,
pct.product_category_name
from sales s,
products p,
product_categories pct
where p.product_id = s.product_id
and pct.product_category_id = p.product_category_id
and pct.product_category_name not in ('GROCERIES', 'CLOTHES')
and s.sale_dt >= trunc(add_months(sysdate, -6), 'mm');

Запрос объединяет информацию о продажах за последние полгода и работает медленно.
На основании данных отчёта sql-мониторинга и информации ниже нужно понять, на каких этапах висит запрос. Какие действия можно предпринять, чтобы его ускорить, не меняя при этом текст запроса?



Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 — SEL$1
5 — SEL$1 / S@SEL$1
6 — SEL$1 / P@SEL$1
7 — SEL$1 / PCT@SEL$1
8 — SEL$1 / PCT@SEL$1

Outline Data
-------------

/*+
BEGIN_OUTLINE_DATA
NLJ_BATCHING(@"SEL$1" "PCT"@"SEL$1")
USE_NL(@"SEL$1" "PCT"@"SEL$1")
USE_NL(@"SEL$1" "P"@"SEL$1")
LEADING(@"SEL$1" "S"@"SEL$1" "P"@"SEL$1" "PCT"@"SEL$1")
INDEX(@"SEL$1" "PCT"@"SEL$1" ("PRODUCT_CATEGORIES"."PRODUCT_CATEGORY_ID"))
FULL(@"SEL$1" "P"@"SEL$1")
FULL(@"SEL$1" "S"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('12.2.0.1')
OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/

Predicate Information (identified by operation id):
---------------------------------------------------

5 — filter("S"."SALE_DT">=TRUNC(ADD_MONTHS(SYSDATE@!,(-6)),'fmmm'))
6 — filter("P"."PRODUCT_ID"="S"."PRODUCT_ID")
7 — access("PCT"."PRODUCT_CATEGORY_ID"="P"."PRODUCT_CATEGORY_ID")
8 — filter("PCT"."PRODUCT_CATEGORY_NAME"<>'GROCERIES' AND "PCT"."PRODUCT_CATEGORY_NAME"<>'CLOTHES')


Я решил так: Создать индексы по product_category_name и s.sale_dt как trunc(sysdate) и партиционировать таблицу sales по полю sale_dt

Может что то еще можно сделать?
То что меня не убивает, делает меня умнее.
Отредактировано 03.04.2025 14:34 Funny Rabbit . Предыдущая версия .
Re: [ora] оптимизация
От: Gt_  
Дата: 03.04.25 14:56
Оценка:
план покажи
Re[2]: [ora] оптимизация
От: Funny Rabbit Россия  
Дата: 03.04.25 15:14
Оценка:
Здравствуйте, Gt_, Вы писали:

Gt_>план покажи


То что меня не убивает, делает меня умнее.
Re[3]: [ora] оптимизация
От: Gt_  
Дата: 03.04.25 18:11
Оценка:
Здравствуйте, Funny Rabbit, Вы писали:

FR>Image: Без имени.png


че-то у тебя самый фиговый план из возможных 3 NL и каждый раз fullscan. таблички похоже крошечные, 0.5M строк, пробуй убрать партишенинг, может стоит засунуть SALES в кеш, благо мелкая таблица. ALTER TABLE .. CACHE
если без партишенинга не придет в чувство, можно cluster table попробовать, так сказать заранее заджойнить SALES и PRODUCTS
https://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT-GUID-CC31365B-83B0-4E09-A047-BF1B79AC887A
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.