查询分析

在执行形态和执行调度上,DMDPC 和普通的 MPP 相比差别很大,为此新增了 V$DPC_STASK_THRD 动态视图,便于用户对性能进行分析。

10.1 查看子计划

相较于 MPP 的计划,DMDPC 下多出了子计划的概念,虽然也是通过 EXPLAIN 获取执行计划,但是更直观的是子计划的独立展示。子计划是使用一对 ESEND/ERECV 操作符来划分的。

举例:

create table M1(c1 int not null, c2 char(1000)) partition by hash(c1)(
 partition p1  storage (on TS_01), 
 partition p2  storage (on TS_02),
 partition p3  storage (on TS_01), 
 partition p4  storage (on TS_02),
 partition p5  storage (on TS_01), 
 partition p6  storage (on TS_02)
) ;
insert into M1 select level, 'aaa' || mod(level, 10) || repeat('x', 20) from dual  connect by level <= 50;
commit;

通过 EXPLAIN 命令获取执行计划:

Explain select /*+ use_hash(m1, sysobjects) xparallel(#1 8) parallel(sysobjects 8) stat(m1 1M) */ count(*) from m1 where c1 in (select mod(id, 10000) from  sysobjects);

1 #NSET2: [170, 1, 4]
2 #PRJT2: [170, 1, 4]; exp_num(1), is_atom(FALSE)
3 #AAGR2: [170, 1, 4]; grp_num(0), sfun_num(1) slave_empty(0)
4 #ERECV: [170, 1, 4]; stask_no(-1), l_stask_no(1), n_key(0),
recv_in_turn(0)
5 #ESEND: [170, 1, 4]; stask_no(1), type(DIRECT), sites(1:8,2:8),
sql_invoke(0), pwj_opt(0), table(-)
6 #AAGR2: [170, 1, 4]; grp_num(0), sfun_num(1) slave_empty(0)
7 #HASH RIGHT SEMI JOIN2: [170, 312, 4]; n_keys(1)
KEY(DMTEMPVIEW_16778238.colname=cast(M1.C1 as BIGINT)) KEY_NULL_EQU(0);
INFO_BITS(0x1)
8 #ERECV: [1, 831, 4]; stask_no(1), l_stask_no(0), n_key(0),
recv_in_turn(0)
9 #ESEND: [1, 831, 4]; stask_no(0), type(BROADCAST), sites(0:8),
sql_invoke(0), pwj_opt(0), table(-)
10 #GI: [1, 831, 4]; policy(RANDOM), gi_unit[0..0]
11 #PRJT2: [1, 831, 4]; exp_num(1), is_atom(FALSE)
12 #SSCN: [1, 831, 4]; SYSINDEXIDSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
13 #GI: [105, 1000000, 4]; policy(RANDOM), gi_unit[0..0]
14 #CSCN2: [105, 1000000, 4]; INDEX33562504(M1)

执行查询语句:

SQL>select /*+ use_hash(m1, sysobjects) xparallel(#1 8) parallel(sysobjects 8) stat(m1 1M) */ count(*) from m1 where c1 in (select mod(id, 20)+10 from  sysobjects);
//查询结果如下:
行号 COUNT(*)
---------- --------------------
1 20
已用时间: 139.984(毫秒). 执行号:16777624.

10.2 查看物理计划生成阶段的计划

DM 提供一个展示物理计划生成阶段的计划(包含子计划拆分细节)的存储过程。

定义:

sp_set_dbg_show (
	mode_name varchar(256),
	v int
)

功能说明:

开启或者关闭物理计划生成阶段(PHD)的计划展示。

参数说明:

mode_name:阶段的名称,取值 PHD。PHD 表示物理计划生成阶段;

v: 开启或者关闭。1:开启;0:关闭。

举例说明:

使用 sp_set_dbg_show('PHD',1)开启 PHD 阶段计划展示。服务器控制台上子任务独立展示如下:

===> 3 stasks, RT <===

>>>> #0: data_source: TAB, n_recv:0, SINGLE PARTITION, sites_source:SELF, parent stask: #1
11  #SEND: [1, 4616, 4]; stask_no(0), type(BROADCAST), n_key(0)
12    #GI: [1, 4616, 4]; policy(RANDOM), gi_unit[0..0]
13      #PRJT2: [1, 4616, 4]; exp_num(1), is_atom(FALSE)
14        #SSCN: [1, 4616, 4]; SYSINDEXIDSYSOBJECTS(SYSOBJECTS)
      MP(id=0): workers 8, scan operator 1
        >>>scan operator#0: partition IDs[0:0], no DPP

>>>> #1: children[#0], data_source: HP_TAB|RECV, n_recv:1, MULTI SITES, sites_source:SELF, parent stask: #2
7   #SEND: [171, 1, 4]; stask_no(1), type(DIRECT), n_key(0)
8     #AAGR2: [171, 1, 4]; grp_num(0), sfun_num(1)
9       #HASH RIGHT SEMI JOIN2: [171, 4808, 4]; key_num(1)
10        #RECV: [1, 4616, 4]; stask_no(1), l_stask_no(0), n_key(0), nth_recv(0), recv_in_turn(0)
15        #GI: [105, 1000000, 4]; policy(RANDOM), gi_unit[0..0]
16          #CSCN2: [105, 1000000, 4]; INDEX33559033(M1)
     BP2(id=3): workers 8, scan operator 1
        >>>scan operator#0: partition IDs[0:4578, 2:4580, 4:4582], no DPP
     BP1(id=2): workers 8, scan operator 1
        >>>scan operator#0: partition IDs[1:4579, 3:4581, 5:4583], no DPP

>>>> #2: children[#1], data_source: RECV, n_recv:1, PQ forbidden, SINGLE SITE, sites_source:C_BP, ROOT task
3   #SEND: [171, 1, 4]; stask_no(2), type(DIRECT), n_key(0)
4     #PRJT2: [171, 1, 4]; exp_num(1), is_atom(FALSE)
5       #AAGR2: [171, 1, 4]; grp_num(0), sfun_num(1)
6         #RECV: [171, 1, 4]; stask_no(2), l_stask_no(1), n_key(0), nth_recv(0), recv_in_turn(0)
     BP2(id=3): workers 1, scan operator 0

这种展示方案更贴近于 SQC 实际调度,包括子任务依赖关系,调度的站点和并行度信息一目了然。

也可以通过 DEM 或者 MANAGER 工具进行图形化的计划展示。下面以 DEM 为例介绍。

图 10.1 通过 DEM 查看执行计划.png

图10.1 通过DEM查看执行计划

在 DEM 的计划展示中可以点击任意操作符图标进行展开或收缩,方便对局部计划细节进行关注。例如,点击 task1 的节点,所展示的计划如下:

图 10.2 展开某个操作符.png

图10.2 展开某个操作符

10.3 查看正在执行的语句信息

使用之前需开启监控。监控开启方法是设置 INI 参数 ENABLE_MONITOR 大于 0。

  1. 查看监控是否开启。
select SF_GET_PARA_STRING_VALUE(1, 'INSTANCE_NAME') as ins_name,* from
v$dm_ini where para_name = 'ENABLE_MONITOR';

如果未开启,可以执行下列语句动态更改。例如,设置 ENABLE_MONITOR=1。

alter system set 'ENABLE_MONITOR'=1 MEMORY;
  1. 获取正在执行语句的执行号。

    1)通过 V$SESSIONS 找到执行的会话 ID 等信息;

    2)根据上一步会话 ID 信息找到对应的 QC、执行号。如果返回多个 QC 记录,可以加入 is_over ='N'排除已完成 SQL 或者根据执行号随时间递增的特性来筛选得到正确的执行号。

例如,以某个执行时间耗时较长的语句 Q1 为例。

//Q1
select /*+ parallel(8) */ count(*) from (select * from j2 x union all select id, pid, id, pid from sys.sysobjects x) t1 join j2 t2 on t1.d2 = t2.d2;

用下列查询获取 Q1 执行号。

with v_sql_1 as (select sess_id, sess_seq from v$sessions 
	where SQL_TEXT like 'select /*+ parallel(8) */ count(*) from %')
	select x.* from v$dpc_qc_history x,v_sql_1 y where x.sess_id = y.sess_id and x.sess_seq = y.sess_seq;

返回的部分结果:

EXEC_ID     MPP_EXEC_ID SQC_EXEC_ID    N_STASK     IDU_FLAG N_SITES     N_HTAB      N_SPL       N_DPP    IS_OVER
	12582912       13313984         1	           2           -        3           0           0           0     N
  1. 根据找到的执行号 12582912,在 V$DPC_STASK_THRD 视图中获取执行的动态信息,观察某个子任务发送、存储行数的变化。
select * from v$dpc_stask_thrd where exec_id = 12582912;

其中,V$DPC_QC_HISTORY 和 V$DPC_STASK_THRD 是在内存中维持特定数量的信息。某些陈旧的已完成记录或者高并发压力下尚未执行完成的记录都存在被淘汰覆盖的可能。

微信扫码
分享文档
扫一扫
联系客服