Я начал изучать оптимизацию запросов Oracle. И у меня есть вопрос по поводу файла трассировки.
Например, в файле трассировки есть план запроса (извините, что без форматирования вам не нужно его читать, просто обратите внимание на SYS_TEMP_0FD9D6611_3CFB8B
):
TEMP TABLE TRANSFORMATION (cr=4,525,645 pr=1 pw=1 time=6.1696s)
LOAD AS SELECT (cr=2 pr=0 pw=1 time=0.0006s)
TABLE ACCESS FULL TABLE3 (cr=2 pr=0 pw=0 time=0.0000s cost=2 size=12 card=4)
SORT AGGREGATE (cr=4,525,643 pr=1 pw=0 time=6.1689s)
NESTED LOOPS OUTER (cr=4,525,643 pr=1 pw=0 time=6.8775s cost=4,522,314 size=42,943,800 card=2,260,200)
TABLE ACCESS FULL TABLE1 (cr=5,241 pr=0 pw=0 time=0.6861s cost=1,429 size=13,561,200 card=2,260,200)
VIEW (cr=4,520,402 pr=1 pw=0 time=5.2771s cost=2 size=13 card=1)
TABLE ACCESS FULL SYS_TEMP_0FD9D6616_3CFB8B (cr=4,520,402 pr=1 pw=0 time=4.1430s cost=2 size=12 card=4)
Если в запросе есть материализованный блок, например:
with tmp as
(select /*+ materialize */ * from table t
where t.val = 'A')
Затем в файле трассировки в плане запроса появляются следующие строки:
STAT #398394272 id=12 cnt=4 pid=11 pos=1 obj=-40016367 op='TABLE ACCESS FULL SYS_TEMP_0FD9D6611_3CFB8B (cr=4 pr=1 pw=0 time=324 us cost=2 size=12 card=4)'
Когда материализованный блок вЗапрос только один, легко понять, что он относится конкретно к вышеуказанному with
блоку.
Но когда много блоков with
, из файла трассировки неясно, к какому блоку принадлежит object SYS_TEMP_0FD9D6611_3CFB8B
.
Я пытался сопоставить по имени object SYS_TEMP_0FD9D6611_3CFB8B
и номер объекта obj=-40016367
, но из файла все еще не ясно, что к чему.
Можете ли вы сказать мне, как определить, к какому материальному блоку относится местоимение?
В запросах, которые яразобраться на работе, есть 10-40 таких материальных блоков. Из-за этого очень легко запутаться в плане запроса.
Или, может, я вообще что-то не так делаю? Моя конечная цель - понять, где висят запросы в процессе ETL. Если я попытаюсь что-то проанализировать неправильно, посоветуйте, как лучше это сделать.