更新时间:2024-07-03 GMT+08:00
分享

Scan方式的Hint

功能描述

指明scan使用的方法,可以是tablescan、indexscan和indexonlyscan。

语法格式

1
[no] tablescan|indexscan|indexonlyscan( [@queryblock] table [index])

参数说明

  • no表示hint的scan方式不使用。
  • @queryblock 见指定Hint所处于的查询块Queryblock,可省略,表示在当前查询块生效。
  • table表示hint指定的表,只能指定一个表,如果表存在别名应优先使用别名进行hint。
  • index表示使用indexscan或indexonlyscan的hint时,指定的索引名称,当前只能指定一个。
  • 对于indexscan或indexonlyscan,只有hint的索引属于hint的表时,才能使用该hint。
  • scan hint支持在行存表、hdfs内外表、、子查询表上指定。对于hdfs内表,由主表和delta表组成,delta表对用户不可见,故hint仅作用在主表上。
  • indexonlyscan的计划也能够被indexscan的hint产生,但indexonly的hint只能产生indexonly的计划。
  • indexscan兼容indexonlyscan时可能带来一些计划变化,使用cost_model_version进行逃生,通过cost_model_version可以控制是否兼容,在大于2或者等于0时生效。

示例

为了hint使用索引扫描,需要首先在表item的i_item_sk列上创建索引,名称为i。

1
create index i on item(i_item_sk);

示例中原语句使用如下hint:

1
2
explain
select /*+ indexscan(item i) */ i_product_name product_name ...

该hint表示:item表使用索引i进行扫描。生成计划如下所示:

在集中式环境下,使用gsi hint会报不支持告警。示例如下。
-- 创建表
CREATE TABLE gsi_test(a int, b int);
CREATE INDEX gsi_test_idx on gsi_test(a);
-- 使用索引
EXPLAIN SELECT /*+  GSI(gsi_test gsi_test_idx) */ * FROM gsi_test where b = 1;
WARNING:  LINE 1: unsupport distributed hint at 'gsi'
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on gsi_test  (cost=0.00..36.86 rows=11 width=8)
   Filter: (b = 1)
(2 rows)
在集中式环境下,使用gsitable hint会报不支持告警。示例如下。
EXPLAIN SELECT /*+ GSITABLE(gsi_test gsi_test_idx) */ * FROM gsi_test where b = 1;
WARNING:  LINE 1: unsupport distributed hint at 'gsitable'
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on gsi_test  (cost=0.00..36.86 rows=11 width=8)
   Filter: (b = 1)
(2 rows)

相关文档