概述
在生产库上看到这样一个存在性能问题的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




