更新时间:2024-06-03 GMT+08:00

指定是否使用minmax优化的hint

功能描述

指定语句是否使用minmax改写。

语法格式

[no] use_minmax[(@queryblock)]

参数说明

  • no表示不使用minmax查询改写。

示例

--准备
create table minmaxtest(f1 int);
create index minmaxtesti on minmaxtest(f1);
insert into minmaxtest values(11), (12);
set explain_perf_mode=pretty;  --打开explain pretty选项,可以看到更详尽计划

--常规场景
gaussdb=# explain (costs off) select min(f1), max(f1) from minmaxtest;
 id |                             operation                              
----+--------------------------------------------------------------------
  1 | ->  Result
  2 |    ->  Limit  [1, InitPlan 1 (returns $0)]
  3 |       ->  Index Only Scan using minmaxtesti on minmaxtest
  4 |    ->  Limit  [1, InitPlan 2 (returns $1)]
  5 |       ->  Index Only Scan Backward using minmaxtesti on minmaxtest
(5 rows)

         Predicate Information (identified by plan id)          
----------------------------------------------------------------
   3 --Index Only Scan using minmaxtesti on minmaxtest
         Index Cond: (f1 IS NOT NULL)
   5 --Index Only Scan Backward using minmaxtesti on minmaxtest
         Index Cond: (f1 IS NOT NULL)
(4 rows)

--使用hint不使用minmax改写
gaussdb=# explain (costs off)select /*+ no use_minmax*/ min(f1), max(f1) from minmaxtest;
 id |           operation           
----+-------------------------------
  1 | ->  Aggregate
  2 |    ->  Seq Scan on minmaxtest
(2 rows)

可以看到使用no use_minmax hint后SQL语句不再使用minmax优化。

--使用minmax hint
analyze;  --收集统计信息
gaussdb=# explain (costs off) select min(f1), max(f1) from minmaxtest;

 id |           operation           
----+-------------------------------
  1 | ->  Aggregate
  2 |    ->  Seq Scan on minmaxtest
(2 rows)

--使用use_minmax hint 选择minmax改写
gaussdb=# explain (costs off) select  /*+ indexonlyscan(minmaxtest) use_minmax*/ min(f1), max(f1) from minmaxtest;
 id |                             operation                              
----+--------------------------------------------------------------------
  1 | ->  Result
  2 |    ->  Limit  [1, InitPlan 1 (returns $0)]
  3 |       ->  Index Only Scan using minmaxtesti on minmaxtest
  4 |    ->  Limit  [1, InitPlan 2 (returns $1)]
  5 |       ->  Index Only Scan Backward using minmaxtesti on minmaxtest
(5 rows)

         Predicate Information (identified by plan id)          
----------------------------------------------------------------
   3 --Index Only Scan using minmaxtesti on minmaxtest
         Index Cond: (f1 IS NOT NULL)
   5 --Index Only Scan Backward using minmaxtesti on minmaxtest
         Index Cond: (f1 IS NOT NULL)
(4 rows)

可以看到use_minmax hint成功生效。

use_minmax优化只有在表扫描使用indexscan的时候生效。