更新时间:2024-11-12 GMT+08:00
Scan方式的Hint
功能描述
指明scan使用的方法,可以是tablescan、indexscan、index(功能同indexscan)、indexonlyscan、gsi或者gsitable。
语法格式
1
|
[no] tablescan|indexscan|index|indexonlyscan|gsi|gsitable( [@queryblock] table [index]) |
参数说明
- no表示hint的scan方式不使用。
- @queryblock 见指定Hint所处的查询块Queryblock章节,可省略,表示在当前查询块生效。
- table表示hint指定的表,只能指定一个表,如果表存在别名应优先使用别名进行hint。
- [index]表示使用indexscan、index、indexonlyscan、gsi以及gsitable的hint时,指定的索引名称,当前只能指定一个。
- 对于indexscan、index、indexonlyscan或gsi,只有hint的索引属于hint的表时,才能使用该hint。
- scan hint支持在行存表、子查询表上指定。
- indexonlyscan的计划能够被indexscan、index的hint产生,但indexonly的hint只能产生indexonly的计划。
- indexscan、index兼容indexonlyscan时可能带来一些计划变化,使用cost_model_version进行逃生,通过cost_model_version可以控制是否兼容,在大于2或者等于0时生效。
- 在满足查询可以使用GSI的前提下,使用gsi的hint将产生使用全局二级索引的index only scan查询计划,而不会产生使用普通索引的查询计划。
- 在满足查询可以使用GSI回表的前提下,使用gsitable的hint将产生使用全局二级索引的回表查询计划。
- 对于gsi的hint,若没有给定queryblock、table以及index,则此gsi的hint支持跨queryblock。
- 如需使用gsitable的hint,则需要打开enable_stream_operator参数,否则hint不生效。
- 支持直接在数据节点查询有效的全局二级索引。
示例
为了hint使用索引扫描,需要首先在表item的i_item_sk列上创建索引,名称为i。
1
|
create index i on item(i_item_sk); |
对示例中原语句使用如下hint:
1 2 3 4 5 |
explain select /*+ indexscan(item i) */ i_product_name product_name ... 或 EXPLAIN SELECT /*+ index(item i) */ i_product_name product_name ... |
该hint表示:item表使用索引i进行扫描。生成计划如下所示:
父主题: 使用Plan Hint进行调优