暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OB 分布式执行计划场景LIMIT 未能及时停止NL循环案例

原创 范计杰 2024-08-30
271

概述

在生产库上看到这样一个存在性能问题的SQL执行计划,以下内容来自SQL MONITOR数据,安全要求,SQL文本及执行计划细节不能拿出来展示,这主要问题点在地NL循环次过多,但根据经验上层存在LIMIT控制达到返回行数后会及时停止,并不会NL获取全部数据。通过各种测试验证,发现OB在分布式执行计划执行时,LIMIT并不能及时控制算子的及时停止,导致性能差。

+--------------+------------+-------------------------------+------------------+------+---------+-------------+-----------+----------------------------+
| PLAN_LINE_ID | PLAN_DEPTH | OPERATOR                      | NAME             | ROWS | STARTS  | OUTPUT_ROWS | READ_ROWS | TIME                       |
+--------------+------------+-------------------------------+------------------+------+---------+-------------+-----------+----------------------------+
|            0 |          0 | PHY_SCALAR_AGGREGATE          | NULL             |    1 |       0 |           1 | NULL      | +000000000 00:04:37.086341 |
|            1 |          1 |  PHY_SUBPLAN_SCAN             | NULL             | 5000 |       0 |        5000 | NULL      | +000000000 00:04:37.086341 |
|            2 |          2 |   PHY_LIMIT                   | NULL             | 5000 |       0 |        5000 | NULL      | +000000000 00:04:37.086341 |
|            3 |          3 |    PHY_NESTED_LOOP_JOIN       | NULL             | 5000 |       0 |        5000 | NULL      | +000000000 00:04:37.086341 |
|            4 |          4 |     PHY_PX_FIFO_COORD         | NULL             | 3574 |       0 |        6000 | NULL      | +000000000 00:04:37.085278 |
|            5 |          5 |      PHY_PX_REDUCE_TRANSMIT   | NULL             | 3574 |       0 |        8018 | NULL      | +000000000 00:00:00.913950 |
|            6 |          6 |       PHY_NESTED_LOOP_JOIN    | NULL             | 3574 |       0 |        8018 | NULL      | +000000000 00:00:00.912888 |
|            7 |          7 |        PHY_PX_FIFO_RECEIVE    | NULL             | 3574 |       0 |       11000 | NULL      | +000000000 00:00:00.912888 |
|            8 |          8 |         PHY_PX_DIST_TRANSMIT  | NULL             | 3574 |       0 |     6070222 | NULL      | +000000000 00:04:36.167048 |
|            9 |          9 |          PHY_NESTED_LOOP_JOIN | NULL             | 3574 |       0 |     6070222 | NULL      | +000000000 00:04:36.167048 |<<<<为什么需要输出这么多行才停止?
|           10 |         10 |           PHY_TABLE_SCAN      | A                | 3574 |       0 |     8290786 | 8295699   | +000000000 00:04:36.167048 |
|           11 |         10 |           PHY_SUBPLAN_SCAN    | NULL             |    1 | 8290786 |     2220564 | NULL      | +000000000 00:04:36.167048 |<<<<为什么需要循环这么多次?
|           12 |         11 |            PHY_TABLE_SCAN     | T(PK_T_ORDER)    |    1 | 8290786 |     2220564 | 1         | +000000000 00:04:36.167048 |
|           13 |          7 |        PHY_TABLE_SCAN         | B                |    1 |   10381 |        8018 | 1         | +000000000 00:00:00.912888 |
|           14 |          4 |     PHY_TABLE_SCAN            | C                |    1 |    5014 |        5000 | 1         | +000000000 00:04:37.086341 |<<<<
+--------------+------------+-------------------------------+------------------+------+---------+-------------+-----------+----------------------------+
15 rows in set (0.032 sec)

模拟示例

1、准备测试数据

create table tab1(id number,id2 number,c varchar2(100));
insert into tab1 select rownum,rownum,'test'||rownum from dual connect by rownum<=100000;
--create index idx_tab1_id on tab1(id);
create index idx_tab1_id2 on tab1(id2);


create table tab2(id number,id2 number,c varchar2(100));
insert into tab2 select rownum,rownum,'test'||rownum from dual connect by rownum<=100000;
create index idx_tab2_id on tab2(id);
create index idx_tab2_id2 on tab2(id2);

update tab1 set id2=id2+100000;
update tab2 set id2=id2+100000;
commit;

2、合并,收集统计信息

alter system major frezee;

3、在同一个节点上的情况

explain extended
select /*+monitor */ count(*)
  from tab1 a, tab2 b
 where a.id = b.id
   and not exists (select 1
          from tab2 c
         where c.id2 = a.id
           and c.id < 100)
   and rownum < 100\G
   
*************************** 1. row ***************************
Query Plan: ==============================================================
|ID|OPERATOR                 |NAME           |EST. ROWS|COST |
--------------------------------------------------------------
|0 |SCALAR GROUP BY          |               |1        |11292|
|1 | SUBPLAN SCAN            |VIEW1          |99       |11288|
|2 |  LIMIT                  |               |99       |11286|
|3 |   NESTED-LOOP JOIN      |               |99       |11285|
|4 |    NESTED-LOOP ANTI JOIN|               |99       |9181 |
|5 |     TABLE SCAN          |A              |99       |48   |
|6 |     SUBPLAN SCAN        |VIEW2          |1        |92   |
|7 |      TABLE SCAN         |C(IDX_TAB2_ID2)|1        |92   |
|8 |    TABLE SCAN           |B(IDX_TAB2_ID) |2        |20   |
==============================================================

Outputs & filters:
-------------------------------------
  0 - output([T_FUN_COUNT(*)(0x7f77282ada70)]), filter(nil),
      group(nil), agg_func([T_FUN_COUNT(*)(0x7f77282ada70)])
  1 - output([remove_const(1)(0x7facc27fb1a0)]), filter(nil),
      access(nil)
  2 - output([remove_const(1)(0x7facc27fb9f0)]), filter(nil), limit(?), offset(nil)
  3 - output([remove_const(1)(0x7facc27fc280)]), filter(nil),
      conds(nil), nl_params_([A.ID(0x7f77283d8f40)]), batch_join=true
  4 - output([A.ID(0x7f77283d8f40)]), filter(nil),
      conds(nil), nl_params_([A.ID(0x7f77283d8f40)]), batch_join=false
  5 - output([A.ID(0x7f77283d8f40)]), filter(nil),
      access([A.ID(0x7f77283d8f40)]), partitions(p0),
      is_index_back=false,
      range_key([A.__pk_increment(0x7facc26a8690)]), range(MIN ; MAX)always true
  6 - output([remove_const(1)(0x7facc27fcad0)]), filter(nil),
      access([VIEW2.C.ID2(0x7f77283d95a0)])
  7 - output([C.ID2(0x7facc278c0d0)]), filter([C.ID(0x7facc278c400) < 100(0x7facc278c730)]),
      access([C.ID2(0x7facc278c0d0)], [C.ID(0x7facc278c400)]), partitions(p0),
      is_index_back=true, filter_before_indexback[false],
      range_key([C.ID2(0x7facc278c0d0)], [C.__pk_increment(0x7facc27b3b00)]), range(MIN,MIN ; MAX,MAX)always true,
      range_cond([C.ID2(0x7facc278c0d0) = ?(0x7facc278d220)])
  8 - output([remove_const(1)(0x7facc27fd320)]), filter(nil),
      access([B.ID(0x7f77283d9270)]), partitions(p0),
      is_index_back=false,
      range_key([B.ID(0x7f77283d9270)], [B.__pk_increment(0x7facc26ad550)]), range(MIN ; MAX),
      range_cond([? = B.ID(0x7f77283d9270)(0x7facc2734830)])

Used Hint:
-------------------------------------
  /*+
      MONITOR
  */

Outline Data:
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      LEADING(@"SEL$3" (("TEST.A"@"SEL$3" "VIEW2"@"SEL$3" )"TEST.B"@"SEL$3" ))
      USE_NL(@"SEL$3" ("TEST.B"@"SEL$3" ))
      PQ_DISTRIBUTE(@"SEL$3" ("TEST.B"@"SEL$3" ) LOCAL LOCAL)
      NO_USE_NL_MATERIALIZATION(@"SEL$3" ("TEST.B"@"SEL$3" ))
      USE_NL(@"SEL$3" ("VIEW2"@"SEL$3" ))
      PQ_DISTRIBUTE(@"SEL$3" ("VIEW2"@"SEL$3" ) LOCAL LOCAL)
      NO_USE_NL_MATERIALIZATION(@"SEL$3" ("VIEW2"@"SEL$3" ))
      FULL(@"SEL$3" "TEST.A"@"SEL$3")
      INDEX(@"SEL$2" "TEST.C"@"SEL$2" "IDX_TAB2_ID2")
      INDEX(@"SEL$3" "TEST.B"@"SEL$3" "IDX_TAB2_ID")
      MONITOR
      END_OUTLINE_DATA
  */

Plan Type:
-------------------------------------
LOCAL

Optimization Info:
-------------------------------------
A:table_rows:100000, physical_range_rows:100000, logical_range_rows:100000, index_back_rows:0, output_rows:100000, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[TAB1], pruned_index_name[IDX_TAB1_ID2], estimation info[table_id:1100611139454096, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480979722-1724896480979722-1724896511189626, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480979722-1724896480979722-1724896511189626, logical_rc:0, physical_rc:0), (table_type:0, version:1724896511189626-1724896511189626-9223372036854775807, logical_rc:0, physical_rc:0)]

C:table_rows:100000, physical_range_rows:1, logical_range_rows:1, index_back_rows:1, output_rows:0, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[IDX_TAB2_ID,IDX_TAB2_ID2], unstable_index_name[TAB2], estimation info[table_id:1100611139454101, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:0, version:1724896510983117-1724896510983117-9223372036854775807, logical_rc:0, physical_rc:0)]

B:table_rows:100000, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[IDX_TAB2_ID], pruned_index_name[IDX_TAB2_ID2,TAB2], estimation info[table_id:1100611139454100, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:0, version:1724896510983117-1724896510983117-9223372036854775807, logical_rc:0, physical_rc:0)]


Parameters:
-------------------------------------
{obj:{"BIGINT":99}, accuracy:{length:-1, precision:20, scale:0}, flag:0, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}

1 row in set (0.009 sec)


+--------------+------------+--------------------------+-----------------+------+--------+-------------+-----------+----------------------------+
| PLAN_LINE_ID | PLAN_DEPTH | OPERATOR                 | NAME            | ROWS | STARTS | OUTPUT_ROWS | READ_ROWS | TIME                       |
+--------------+------------+--------------------------+-----------------+------+--------+-------------+-----------+----------------------------+
|            0 |          0 | PHY_SCALAR_AGGREGATE     | NULL            |    1 |      0 |           1 | NULL      | +000000000 00:00:00.012782 |
|            1 |          1 |  PHY_SUBPLAN_SCAN        | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012782 |
|            2 |          2 |   PHY_LIMIT              | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012782 |
|            3 |          3 |    PHY_NESTED_LOOP_JOIN  | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012782 |
|            4 |          4 |     PHY_NESTED_LOOP_JOIN | NULL            |   99 |      0 |        1000 | NULL      | +000000000 00:00:00.012782 |<<<只输出了1000行,实际可输出100000
|            5 |          5 |      PHY_TABLE_SCAN      | A               |   99 |      0 |        1000 | 100000    | +000000000 00:00:00.012782 |
|            6 |          5 |      PHY_SUBPLAN_SCAN    | NULL            |    1 |   1000 |           0 | NULL      | +000000000 00:00:00.012782 |
|            7 |          6 |       PHY_TABLE_SCAN     | C(IDX_TAB2_ID2) |    1 |   1000 |           0 | 1         | +000000000 00:00:00.012782 |
|            8 |          4 |     PHY_TABLE_SCAN       | B(IDX_TAB2_ID)  |    2 |     99 |          99 | 1         | +000000000 00:00:00.012782 |
+--------------+------------+--------------------------+-----------------+------+--------+-------------+-----------+----------------------------+

select /*+monitor */ count(*)
  from tab1 a 
 where not exists (select 1
          from tab2 c
         where c.id2 = a.id
           and c.id < 100);
+----------+
| COUNT(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.095 sec)

3、移动主副本,制造不在一个节点的情况(分布式执行计划)

obclient [oceanbase]> select database_id,database_name from __all_virtual_database where tenant_id=1001 AND database_name='TEST';
+------------------+---------------+
| database_id      | database_name |
+------------------+---------------+
| 1100611139404850 | TEST          |
+------------------+---------------+
1 row in set (0.009 sec)


obclient [oceanbase]> select  table_name,table_id  from __all_virtual_table where table_name in ('TAB1','TAB2') and tenant_id=1001 and database_id=1100611139404850;
+------------+------------------+
| table_name | table_id         |
+------------+------------------+
| TAB1       | 1100611139454096 |
| TAB2       | 1100611139454099 |
+------------+------------------+
2 rows in set (0.010 sec)


select table_id,svr_ip,role from __all_virtual_meta_table where table_id in (1100611139454096,1100611139454099);


obclient [oceanbase]> select table_id,svr_ip,role from __all_virtual_meta_table where table_id in (1100611139454096,1100611139454099);
+------------------+---------------+------+
| table_id         | svr_ip        | role |
+------------------+---------------+------+
| 1100611139454096 | 192.168.56.36 |    1 |
| 1100611139454096 | 192.168.56.37 |    2 |
| 1100611139454096 | 192.168.56.38 |    2 |
| 1100611139454099 | 192.168.56.36 |    1 |
| 1100611139454099 | 192.168.56.37 |    2 |
| 1100611139454099 | 192.168.56.38 |    2 |
+------------------+---------------+------+
6 rows in set (0.015 sec)

obclient [TEST]> alter table test.tab2 primary_zone='zone2;zone1;zone3';
Query OK, 0 rows affected (0.049 sec)



obclient [oceanbase]> select table_id,svr_ip,role from __all_virtual_meta_table where table_id in (1100611139454096,1100611139454099);
+------------------+---------------+------+
| table_id         | svr_ip        | role |
+------------------+---------------+------+
| 1100611139454096 | 192.168.56.36 |    1 |
| 1100611139454096 | 192.168.56.37 |    2 |
| 1100611139454096 | 192.168.56.38 |    2 |
| 1100611139454099 | 192.168.56.36 |    2 |
| 1100611139454099 | 192.168.56.37 |    1 |
| 1100611139454099 | 192.168.56.38 |    2 |
+------------------+---------------+------+
6 rows in set (0.016 sec)



4、测试多层NL,LIMIT效果

explain extended
select /*+monitor */ count(*)
  from tab1 a, tab2 b
 where a.id = b.id
   and not exists (select 1
          from tab2 c
         where c.id2 = a.id
           and c.id < 100)
   and rownum < 100\G


*************************** 1. row ***************************
Query Plan: ===========================================================================
|ID|OPERATOR                              |NAME           |EST. ROWS|COST |
---------------------------------------------------------------------------
|0 |PX COORDINATOR                        |               |1        |11307|
|1 | EXCHANGE OUT DISTR                   |:EX10002       |1        |11306|
|2 |  SCALAR GROUP BY                     |               |1        |11306|
|3 |   SUBPLAN SCAN                       |VIEW1          |99       |11303|
|4 |    LIMIT                             |               |99       |11301|
|5 |     NESTED-LOOP JOIN                 |               |99       |11300|
|6 |      EXCHANGE IN DISTR               |               |99       |9195 |
|7 |       EXCHANGE OUT DISTR (BC2HOST)   |:EX10001       |99       |9188 |
|8 |        NESTED-LOOP ANTI JOIN         |               |99       |9188 |
|9 |         EXCHANGE IN DISTR            |               |99       |55   |
|10|          EXCHANGE OUT DISTR (BC2HOST)|:EX10000       |99       |48   |<<<<
|11|           TABLE SCAN                 |A              |99       |48   |
|12|         SUBPLAN SCAN                 |VIEW2          |1        |92   |
|13|          TABLE SCAN                  |C(IDX_TAB2_ID2)|1        |92   |
|14|      TABLE SCAN                      |B(IDX_TAB2_ID) |2        |20   |
===========================================================================

Outputs & filters:
-------------------------------------
  0 - output([INTERNAL_FUNCTION(T_FUN_COUNT(*)(0x7f4d9d0988d0))(0x7f71cc3548b0)]), filter(nil)
  1 - output([INTERNAL_FUNCTION(T_FUN_COUNT(*)(0x7f4d9d0988d0))(0x7f71cc3548b0)]), filter(nil), is_single, dop=1
  2 - output([T_FUN_COUNT(*)(0x7f4d9d0988d0)]), filter(nil),
      group(nil), agg_func([T_FUN_COUNT(*)(0x7f4d9d0988d0)])
  3 - output([remove_const(1)(0x7f71cc35c500)]), filter(nil),
      access(nil)
  4 - output([remove_const(1)(0x7f71cc35cd50)]), filter(nil), limit(?), offset(nil)
  5 - output([remove_const(1)(0x7f71cc35d5e0)]), filter(nil),
      conds(nil), nl_params_([A.ID(0x7f4d9d1c3da0)]), batch_join=true
  6 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil)
  7 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil), is_single, dop=1
  8 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil),
      conds(nil), nl_params_([A.ID(0x7f4d9d1c3da0)]), batch_join=false
  9 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil)
  10 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil), is_single, dop=1
  11 - output([A.ID(0x7f4d9d1c3da0)]), filter(nil),
      access([A.ID(0x7f4d9d1c3da0)]), partitions(p0),
      is_index_back=false,
      range_key([A.__pk_increment(0x7f71cc1e8690)]), range(MIN ; MAX)always true
  12 - output([remove_const(1)(0x7f71cc35de30)]), filter(nil),
      access([VIEW2.C.ID2(0x7f4d9d1c4400)])
  13 - output([C.ID2(0x7f71cc2cc0d0)]), filter([C.ID(0x7f71cc2cc400) < 100(0x7f71cc2cc730)]),
      access([C.ID2(0x7f71cc2cc0d0)], [C.ID(0x7f71cc2cc400)]), partitions(p0),
      is_index_back=true, filter_before_indexback[false],
      range_key([C.ID2(0x7f71cc2cc0d0)], [C.__pk_increment(0x7f71cc2f3b00)]), range(MIN,MIN ; MAX,MAX)always true,
      range_cond([C.ID2(0x7f71cc2cc0d0) = ?(0x7f71cc2cd220)])
  14 - output([remove_const(1)(0x7f71cc35e680)]), filter(nil),
      access([B.ID(0x7f4d9d1c40d0)]), partitions(p0),
      is_index_back=false,
      range_key([B.ID(0x7f4d9d1c40d0)], [B.__pk_increment(0x7f71cc1ed550)]), range(MIN ; MAX),
      range_cond([? = B.ID(0x7f4d9d1c40d0)(0x7f71cc274830)])

Used Hint:
-------------------------------------
  /*+
  */

Outline Data:
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      LEADING(@"SEL$3" (("TEST.A"@"SEL$3" "VIEW2"@"SEL$3" )"TEST.B"@"SEL$3" ))
      USE_NL(@"SEL$3" ("TEST.B"@"SEL$3" ))
      PQ_DISTRIBUTE(@"SEL$3" ("TEST.B"@"SEL$3" ) BC2HOST NONE)
      NO_USE_NL_MATERIALIZATION(@"SEL$3" ("TEST.B"@"SEL$3" ))
      USE_NL(@"SEL$3" ("VIEW2"@"SEL$3" ))
      PQ_DISTRIBUTE(@"SEL$3" ("VIEW2"@"SEL$3" ) BC2HOST NONE)
      NO_USE_NL_MATERIALIZATION(@"SEL$3" ("VIEW2"@"SEL$3" ))
      FULL(@"SEL$3" "TEST.A"@"SEL$3")
      INDEX(@"SEL$2" "TEST.C"@"SEL$2" "IDX_TAB2_ID2")
      INDEX(@"SEL$3" "TEST.B"@"SEL$3" "IDX_TAB2_ID")
      END_OUTLINE_DATA
  */

Plan Type:
-------------------------------------
DISTRIBUTED

Optimization Info:
-------------------------------------
A:table_rows:100000, physical_range_rows:100000, logical_range_rows:100000, index_back_rows:0, output_rows:100000, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[TAB1], pruned_index_name[IDX_TAB1_ID2], estimation info[table_id:1100611139454096, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480979722-1724896480979722-1724896511189626, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480979722-1724896480979722-1724896511189626, logical_rc:0, physical_rc:0), (table_type:0, version:1724896511189626-1724896511189626-9223372036854775807, logical_rc:0, physical_rc:0)]

C:table_rows:100000, physical_range_rows:1, logical_range_rows:1, index_back_rows:1, output_rows:0, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[IDX_TAB2_ID,IDX_TAB2_ID2], unstable_index_name[TAB2], estimation info[table_id:1100611139454101, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:0, version:1724896510983117-1724896510983117-9223372036854775807, logical_rc:0, physical_rc:0)]

B:table_rows:100000, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[IDX_TAB2_ID], pruned_index_name[IDX_TAB2_ID2,TAB2], estimation info[table_id:1100611139454100, (table_type:1, version:0-1724896490882778-1724896490882778, logical_rc:100000, physical_rc:100000), (table_type:7, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:5, version:1724896480771474-1724896480771474-1724896510983117, logical_rc:0, physical_rc:0), (table_type:0, version:1724896510983117-1724896510983117-9223372036854775807, logical_rc:0, physical_rc:0)]


Parameters:
-------------------------------------
{obj:{"BIGINT":99}, accuracy:{length:-1, precision:20, scale:0}, flag:0, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}

1 row in set (0.009 sec)


+--------------+------------+--------------------------------+-----------------+------+--------+-------------+-----------+----------------------------+
| PLAN_LINE_ID | PLAN_DEPTH | OPERATOR                       | NAME            | ROWS | STARTS | OUTPUT_ROWS | READ_ROWS | TIME                       |
+--------------+------------+--------------------------------+-----------------+------+--------+-------------+-----------+----------------------------+
|            0 |          0 | PHY_PX_FIFO_COORD              | NULL            |    1 |      0 |           1 | NULL      | +000000000 00:00:01.339671 |
|            1 |          1 |  PHY_PX_REDUCE_TRANSMIT        | NULL            |    1 |      0 |           1 | NULL      | +000000000 00:00:00.012857 |
|            2 |          2 |   PHY_SCALAR_AGGREGATE         | NULL            |    1 |      0 |           1 | NULL      | +000000000 00:00:00.012857 |
|            3 |          3 |    PHY_SUBPLAN_SCAN            | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012857 |
|            4 |          4 |     PHY_LIMIT                  | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012857 |
|            5 |          5 |      PHY_NESTED_LOOP_JOIN      | NULL            |   99 |      0 |          99 | NULL      | +000000000 00:00:00.012857 |
|            6 |          6 |       PHY_PX_FIFO_RECEIVE      | NULL            |   99 |      0 |        1000 | NULL      | +000000000 00:00:00.012857 |
|            7 |          7 |        PHY_PX_DIST_TRANSMIT    | NULL            |   99 |      0 |      100000 | NULL      | +000000000 00:00:01.241698 |
|            8 |          8 |         PHY_NESTED_LOOP_JOIN   | NULL            |   99 |      0 |      100000 | NULL      | +000000000 00:00:01.241698 |<<<<输出100000行
|            9 |          9 |          PHY_PX_FIFO_RECEIVE   | NULL            |   99 |      0 |      100000 | NULL      | +000000000 00:00:01.241698 |
|           10 |         10 |           PHY_PX_DIST_TRANSMIT | NULL            |   99 |      0 |      100000 | NULL      | +000000000 00:00:00.078901 |
|           11 |         11 |            PHY_TABLE_SCAN      | A               |   99 |      0 |      100000 | 100000    | +000000000 00:00:00.078901 |
|           12 |          9 |          PHY_SUBPLAN_SCAN      | NULL            |    1 | 100000 |           0 | NULL      | +000000000 00:00:01.241698 |
|           13 |         10 |           PHY_TABLE_SCAN       | C(IDX_TAB2_ID2) |    1 | 100000 |           0 | 1         | +000000000 00:00:01.241698 |
|           14 |          6 |       PHY_TABLE_SCAN           | B(IDX_TAB2_ID)  |    2 |     99 |          99 | 1         | +000000000 00:00:00.012857 |
+--------------+------------+--------------------------------+-----------------+------+--------+-------------+-----------+----------------------------+




最后修改时间:2024-10-22 17:25:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论