文档

HINT简介

更新时间:

HINT作为一种SQL补充语法,在数据库中扮演着非常重要的角色。HINT可以改变SQL的执行方式。Lindorm宽表SQL也支持HINT语法,例如使用HINT进行多版本数据管理。本文介绍HINT的基本语法和使用场景。

前提条件

宽表引擎为2.3.1及以上版本。如何查看或升级当前版本,请参见宽表引擎版本说明升级小版本

使用限制

  • HINT必须在INSERT、UPSERT、DELETE和SELECT关键字后使用。

  • 宽表引擎为2.5.2.1以下版本时,HINT仅支持简单查询,不支持子查询、分组查询等复杂查询。

HINT语法

hintExpression ::= /*+ hintItems */

hintItems ::= hintItem (',' hintItem )*

hintItem ::= identifier ('(' hintOption ( ',' hintOption)* ')')?

identifier ::=  ( [A-Z] | '_' ) ( [A-Z] | [0-9] | '_' | '@' | ':')*
说明
  • HINT的格式为/*+ hintItems */。其中hintItems是HINT语句,与具体的操作相关。多个hintItems之间需使用半角逗号(,)分隔。

  • Lindorm宽表SQL语句中,仅允许直接在INSERT、UPSERT、DELETE和SELECT关键字后指定HINT。错误示例:UPSERT INTO /*+ _l_ts_(3000) */ t_test_ts(c1, c3) VALUES (1, 'c3');

hintOption参数说明

参数

数据类型

说明

_l_operation_timeout_

说明

宽表引擎为2.5.2.1以下版本时,该参数名称为operationtimeout

INT

DML操作的执行超时时间。默认值为120,000。取值范围大于0,单位为毫秒(ms)。支持UPSERT、DELETE和SELECT。

说明

_l_operation_timeout_可以和其他HINT参数同时使用,使用时需要用英文逗号(,)分隔。例如:SELECT /*+ _l_operation_timeout_(1000), _l_force_index_('idx1') */ * from test;

_l_force_index_

STRING

强制选择索引。仅支持SELECT。

说明

_l_force_index_参数不能与_l_ignore_index_参数同时使用。

_l_ignore_index_

不涉及

忽略索引,不使用索引直接在数据表查询数据。可用于对比使用索引和不使用索引时的查询性能差异等场景。不涉及取值,使用时直接调用即可。仅支持SELECT。

说明

_l_ignore_index_参数不能与_l_force_index_参数同时使用。

_l_allow_filtering_

不涉及

默认情况下,若查询的WHERE条件为非主键列时,查询将报错。使用该参数后,允许进行低效全表扫描查询,查询将不会报错。不涉及取值,使用时直接调用即可。仅支持SELECT。

_l_versions_

INT

在查询结果中返回最新N个版本的数据。取值范围大于0。仅支持SELECT。

_l_ts_

BIGINT

多版本管理的时间戳,用于指定非主键列写入或查询时的时间戳。取值范围大于0。单位为毫秒(ms)。支持UPSERT和SELECT。

_l_ts_min_

BIGINT

多版本管理的最小时间戳,用于过滤查询结果。取值范围大于0。单位为毫秒(ms)。仅支持SELECT。

_l_ts_max_

BIGINT

多版本管理的最大时间戳,用于过滤查询结果。取值范围大于0。单位为毫秒(ms)。仅支持SELECT。

_l_hot_only_

BOOLEAN

是否只查询热数据。仅支持SELECT。

取值如下:

  • true:仅查询表中的热数据。

  • false:查询表中所有数据。

    说明

    _l_hot_only_设置为false时,与不使用该HINT的查询效果相同。

示例

  • 示例一:在执行统计表大小的查询中指定该DML操作的超时时间为30,000ms。

    SELECT /*+  _l_operation_timeout_(30000) */ COUNT(*) FROM t_test_ts;

    返回结果:

    +----------+
    | COUNT(*) |
    +----------+
    | 1        |
    +----------+
  • 示例二:在写入数据行时指定该DML操作的超时时间为30,000ms。

    UPSERT /*+  _l_operation_timeout_(30000) */ INTO t_test_ts(c1, c2, c3) values(1,2,3);
  • 示例三:在删除满足条件的数据时指定该DML操作执行的超时时间为30,000ms。

    DELETE /*+  _l_operation_timeout_(30000) */ FROM tb WHERE c1 = 1;
  • 示例四:使用_l_force_index_强制选择索引。

    SELECT /*+  _l_force_index_('idx1') */ COUNT(*) FROM tb;   //'idx1' 为已经创建的索引名称。

    返回结果:

    +----------+
    | COUNT(*) |
    +----------+
    | 1        |
    +----------+
  • 示例五:使用_l_ignore_index_强制忽略索引。

    SELECT /*+  _l_ignore_index_ */ COUNT(*) FROM tb;

    返回结果:

    +----------+
    | COUNT(*) |
    +----------+
    | 1        |
    +----------+
  • 示例六:使用_l_allow_filtering_过滤指定数据。

    SELECT /*+ _l_allow_filtering_ */ COUNT(*) FROM tb WHERE c1 = 2;

    返回结果:

    +----------+
    | COUNT(*) |
    +----------+
    | 1        |
    +----------+

    过滤条件中的c1不是主键,也不是索引。使用该HINT后不会报错。

  • 示例七:使用_l_ts_为写入的数据行指定时间戳。

    UPSERT /*+ _l_ts_(3000) */ INTO t_test_ts(c1, c3) VALUES (1, 'c3');
  • 示例八:使用_l_versions_返回最新版本的数据。

    SELECT /*+ _l_versions_(1) */ c1, c3, c3_l_ts FROM t_test_ts;

    返回结果:

    +----+----+---------+
    | c1 | c3 | c3_l_ts |
    +----+----+---------+
    | 1  | c3 | 3000    |
    +----+----+---------+

使用场景

在以下场景中可以使用HINT。