全部產品
Search
文件中心

Lindorm:HINT

更新時間:Dec 05, 2024

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。

通過HINT查詢熱資料