更新时间:2024-12-06 GMT+08:00
分享

Scan方式的Hint

功能描述

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

语法格式

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

参数说明

  • no表示hint的scan方式不使用。
  • block_name表示语句块的block_name,详细说明请参考block_name
  • table表示hint指定的表,只能指定一个表,如果表存在别名应优先使用别名进行hint。
    • 表的语法格式如下:

      [schema.]table[@block_name]

      表名可以带schema,也可以带所在子查询语句块提升前的block_name。子查询语句块在优化器进行优化重写的发生提升,则该block_name会与leading中block_name不同。

    • 表如果存在别名,优先使用别名来表示该表。
  • index表示使用indexscan或indexonlyscan的hint时,指定的索引名称,当前只能指定一个。

    对于indexscan或indexonlyscan,只有hint的索引属于hint的表时,才能使用该hint。

    scan hint支持在行列存表、hdfs内外表、obs表、子查询表上指定。对于hdfs内表,由主表和delta表组成,delta表对用户不可见,故hint仅作用在主表上。

    指定indexscan可生效indexscan或indexonlyscan,indexscan或indexonlyscan也可同时出现。当indexscan和indexonlyscan hint同时出现,优先生效indexonlyscan。

示例

为了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进行扫描。生成计划如下所示:

相关文档