14.OB4.0算子-1.TABLE SCAN

1.算子示例

CREATE TABLE T1(C1 INT PRIMARY KEY,C2 INT,C3 INT,C4 INT,INDEX K1(C2,C3));
explain extended select * from t1 where c1=1\G ;
obclient [sjzt]> explain extended select * from t1 where c1=1\G ;
*************************** 1. row ***************************
Query Plan: Plan signature: 12843576483891728377
==================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
----------------------------------
|0 |TABLE GET|t1  |1        |3   |
==================================

Outputs & filters: 
-------------------------------------
  0 - output([t1.C1(0x7f107243a6f0)], [t1.C2(0x7f107243ac50)], [t1.C3(0x7f107243af30)], [t1.C4(0x7f107243b210)]), filter(nil), rowset=256, 
      access([t1.C1(0x7f107243a6f0)], [t1.C2(0x7f107243ac50)], [t1.C3(0x7f107243af30)], [t1.C4(0x7f107243b210)]), partitions(p0), 
      is_index_back=false, 
      range_key([t1.C1(0x7f107243a6f0)]), range[1 ; 1], 
      range_cond([t1.C1(0x7f107243a6f0) = 1(0x7f107243a010)])

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

Qb name trace:
-------------------------------------
  stmt_id:0, stmt_type:T_EXPLAIN 
  stmt_id:1, SEL$1

Outline Data:
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "sjzt"."t1"@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('4.0.0.0')
      END_OUTLINE_DATA
  */
Plan Type:
-------------------------------------
LOCAL
Optimization Info:
-------------------------------------
t1:table_rows:1, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback
Parameters:
-------------------------------------
1 row in set (0.098 sec)
ERROR: 

#如上没有用到索引。索引返回数据0行。全表扫描。
#TABLE GET:直接用主键定位数据。
#使用基于规则的优化器:rule_based

2.示例2 

explain extended select * from t1 where c2<1 and c3<1 and c4<1\G
obclient [sjzt]> explain extended select * from t1 where c2<1 and c3<1 and c4<1\G
*************************** 1. row ***************************
Query Plan: Plan signature: 10864452679563555170
=====================================
|ID|OPERATOR  |NAME  |EST. ROWS|COST|
-------------------------------------
|0 |TABLE SCAN|t1(K1)|1        |3   |
=====================================

Outputs & filters: 
-------------------------------------
  0 - output([t1.C1(0x7f108b83d740)], [t1.C2(0x7f108b83ae00)], [t1.C3(0x7f108b83bff0)], [t1.C4(0x7f108b83d1e0)]), filter([t1.C3(0x7f108b83bff0) < 1(0x7f108b83b910)], [t1.C4(0x7f108b83d1e0) < 1(0x7f108b83cb00)]), rowset=256, 
      access([t1.C1(0x7f108b83d740)], [t1.C2(0x7f108b83ae00)], [t1.C3(0x7f108b83bff0)], [t1.C4(0x7f108b83d1e0)]), partitions(p0), 
      is_index_back=true, filter_before_indexback[true,false], 
      range_key([t1.C2(0x7f108b83ae00)], [t1.C3(0x7f108b83bff0)], [t1.C1(0x7f108b83d740)]), range(NULL,MAX,MAX ; 1,MIN,MIN), 
      range_cond([t1.C2(0x7f108b83ae00) < 1(0x7f108b83a720)])

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

Qb name trace:
-------------------------------------
  stmt_id:0, stmt_type:T_EXPLAIN 
  stmt_id:1, SEL$1


Outline Data:
-------------------------------------
  /*+
      BEGIN_OUTLINE_DATA
      INDEX(@"SEL$1" "sjzt"."t1"@"SEL$1" "K1")
      OPTIMIZER_FEATURES_ENABLE('4.0.0.0')
      END_OUTLINE_DATA
  */

Plan Type:
-------------------------------------
LOCAL
Optimization Info:
-------------------------------------
t1:table_rows:1, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:0, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[K1], unstable_index_name[t1]

Parameters:
-------------------------------------
1 row in set (0.004 sec)

#索引在C2,C3 上,通过k1索引扫描。因为表中无数据,所以索引返回0行。
#优化器使用基于成本的优化器:cost_based,可用索引是k1;

3.

执行计划中各个关键词的解释。

OPERATOR:
TABLE SCAN 算子的 operator 有两种形式:TABLE SCAN 和 TABLE GET 
TABLE SCAN 属于范围扫描,会返回 0 行或者多行数据。
TABLE GET 直接用主键定位,返回 0 行或者 1 行数据

NAME:
选择用哪个索引来访问数据。选择的索引的名字会跟在表名后面,如果没有索引的名字,则说明执行的是主表扫描。 
这里需要注意,在 OceanBase 数据库中,主表和索引的组织结构是一样的,主键本身也是一个索引

OUTPUT:
该算子的输出列
filter:
该算子的过滤谓词。 由于示例中 Q1 查询的 TABLE GET 算子没有设置 filter,所以为 nil。nil的含义是:0;

PARTITIONS:
查询需要扫描的分区

IS_INDEX_BACK:
该算子是否需要回表。 例如,在 Q1 查询中,因为选择了主表,所以不需要回表。
在 Q2 查询中,索引列是 (c2,c3,c1), 由于查询需要返回 c4 列,所以需要回表。

FILTER_BEFORE_INDEXBACK
与每个 filter 对应,表明该 filter 是可以直接在索引上进行计算,还是需要索引回表之后才能计算。 
例如,在 Q2 查询中,当 filter 为 c3 < 1 时, 可以直接在索引上计算,能减少回表数量;
当 filter 为 c4 < 1 时,需要回表取出 c4 列之后才能计算。

RANGE_KEY/RANGE/RANGE_COND

RANGE_KEY:索引的 ROWKEY 列。
RANGE:索引开始扫描和结束扫描的位置。判断是否是全表扫描需要关注 RANGE 的范围。
例如,对于一个 ROWKEY 有三列的场景,RANGE(MIN,MIN, MIN ; MAX, MAX, MAX) 代表的就是真正意义上的全表扫描。
RANGE_COND:决定索引开始扫描和结束扫描位置的相关谓词。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值