
# Scan方式的Hint
#### 功能描述
指明scan使用的方法，可以是tablescan、indexscan、indexonlyscan，或者gsi。
#### 语法格式
```
[no] tablescan|indexscan|indexonlyscan|gsi( [@queryblock] table [index])
```
#### 参数说明
- **no**表示hint的scan方式不使用。
- @queryblock 见[指定Hint所处的查询块Queryblock](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0274.html#ZH-CN_TOPIC_0000002235270173)章节，可省略，表示在当前查询块生效。
 
- **table**表示hint指定的表，只能指定一个表，如果表存在别名应优先使用别名进行hint。
- **index**表示使用indexscan、indexonlyscan或者gsi的hint时，指定的索引名称，当前只能指定一个。
![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 对于indexscan、indexonlyscan或gsi，只有hint的索引属于hint的表时，才能使用该hint。
- scan hint支持在行、子查询表上指定。
- indexonlyscan的计划也能够被indexscan 的hint产生，但indexonly的hint只能产生indexonly的计划。
- indexscan兼容indexonlyscan时可能带来一些计划变化，使用cost_model_version进行逃生，通过cost_model_version可以控制是否兼容，在大于2或者等于0时生效。
- 在满足查询可以使用gsi的前提下，使用gsi的hint将产生使用全局二级索引的index only scan查询计划，而不会产生使用普通索引的查询计划。
- 对于gsi的hint，若没有给定queryblock、table以及index，则此gsi的hint支持跨queryblock。
- 支持直接在数据节点查询有效的全局二级索引。
- 当前版本全局二级索引不支持回表查询。
 
#### 示例
为了hint使用索引扫描，需要首先在表item的i_item_sk列上创建索引，名称为i。
```
create index i on item(i_item_sk);
```
对[示例](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0273.html#ZH-CN_TOPIC_0000002235390017__zh-cn_topic_0000002235098917_section671421102912)中原语句使用如下hint:
```
explain
select /*+ indexscan(item i) */ i_product_name product_name ...
```
该hint表示：item表使用索引i进行扫描。生成计划如下所示：
![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/figure/zh-cn_image_0000002200299232.png "点击放大")
