2026-03-12 20:23:15
This commit is contained in:
128
Kevin_Meade/showplanquerydiagram11g.sql
Normal file
128
Kevin_Meade/showplanquerydiagram11g.sql
Normal file
@@ -0,0 +1,128 @@
|
||||
--
|
||||
-- show a query diagram for the current plan of the plan_table
|
||||
-- uses the join tree with extended information
|
||||
--
|
||||
-- usage is: @SHOWPLANQUERYDIAGRAM11G
|
||||
--
|
||||
|
||||
col query_diagram format a300
|
||||
col query_name format a30
|
||||
break on query_name skip 1 dup
|
||||
|
||||
with
|
||||
plan_table_current as (
|
||||
select *
|
||||
from plan_table
|
||||
where plan_id = (select max(plan_id) from plan_table)
|
||||
)
|
||||
, predicate_data as (
|
||||
select nvl(query_name,'SEL$1') adjusted_query_name
|
||||
,z.*
|
||||
from (
|
||||
select case
|
||||
when table_2_alias is null then 'CONSTANT TEST'
|
||||
else 'JOIN'
|
||||
end expression_type
|
||||
,substr(pt.object_alias,instr(object_alias,'@')+1) query_name
|
||||
,y.*
|
||||
from plan_table_current pt
|
||||
,(
|
||||
select case
|
||||
when instr(predicate_expression,'.') > 0 then substr(predicate_expression,1,instr(predicate_expression,'.')-1)
|
||||
else (select substr(object_alias,1,instr(object_alias,'@')-1) from plan_table_current where id = x.id and rownum = 1)
|
||||
end table_1_alias
|
||||
,substr(predicate_expression,instr(predicate_expression,'=')+1,instr(predicate_expression,'.',1,2)-instr(predicate_expression,'=')-1) table_2_alias
|
||||
,x.*
|
||||
from (
|
||||
select distinct *
|
||||
from (
|
||||
select id,substr( ' '||p||' '
|
||||
,instr(' '||p||' ',' ',1,level)+1
|
||||
,instr(' '||p||' ',' ',1,level+1)-instr(' '||p||' ',' ',1,level)-1
|
||||
) predicate_expression
|
||||
,level rowno
|
||||
,p
|
||||
from (
|
||||
select *
|
||||
from (
|
||||
select id,trim(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
p
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
,' ',' ')
|
||||
) p
|
||||
from (
|
||||
select id,trim(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
replace(
|
||||
p
|
||||
,'"')
|
||||
,' AND ',' ')
|
||||
,' OR ',' ')
|
||||
,' NOT ',' ')
|
||||
,'(',' ')
|
||||
,')',' ')
|
||||
,' and ',' ')
|
||||
,' and ',' ')
|
||||
) p
|
||||
from (
|
||||
select id,access_predicates||' '||filter_predicates p
|
||||
from plan_table_current
|
||||
where rownum >= 1
|
||||
)
|
||||
)
|
||||
)
|
||||
where p is not null
|
||||
)
|
||||
connect by level <= length(p)-length(replace(p,' '))+1
|
||||
)
|
||||
) x
|
||||
) y
|
||||
where y.id = pt.id
|
||||
) z
|
||||
)
|
||||
, constant_test as (
|
||||
select distinct expression_type,table_1_alias
|
||||
from predicate_data
|
||||
where expression_type = 'CONSTANT TEST'
|
||||
)
|
||||
select t.query_name
|
||||
,decode(ct,'c','c',' ')||lpad(decode(ct,'c','-',' '),(lvlno)*3,decode(ct,'c','-',' '))||table_2_alias query_diagram
|
||||
from (
|
||||
select query_name,table_1_alias,table_2_alias
|
||||
,level lvlno
|
||||
,max(level) over (partition by query_name) max_lvlno
|
||||
,case when (select expression_type from constant_test where table_1_alias = x.table_2_alias) is not null then 'c' end ct
|
||||
from (
|
||||
select distinct adjusted_query_name query_name,table_1_alias,table_2_alias
|
||||
from predicate_data
|
||||
where expression_type = 'JOIN'
|
||||
union all
|
||||
select distinct adjusted_query_name query_name,null,table_1_alias
|
||||
from predicate_data
|
||||
where table_1_alias not in (select table_2_alias from predicate_data where table_2_alias is not null)
|
||||
) x
|
||||
connect by prior table_2_alias = table_1_alias
|
||||
and prior query_name = query_name
|
||||
start with table_1_alias is null
|
||||
) t
|
||||
/
|
||||
Reference in New Issue
Block a user