HINT作為一種SQL補充語法,在數據庫中扮演著非常重要的角色。HINT可以改變SQL的執行方式。Lindorm寬表SQL也支持HINT語法,例如使用HINT進行多版本數據管理。本文介紹HINT的基本語法和使用場景。
前提條件
使用限制
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參數同時使用,使用時需要用英文逗號(,)分隔。例如: |
_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。 取值如下:
|
示例
示例一:在執行統計表大小的查詢中指定該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。