Hints are supplementary to the SQL syntax and play an important role in queries performed on databases. You can use hints in a SQL statement to change the method in which the SQL statement is executed. LindormTable supports hints in SQL statements. For example, you can use hints in LindormTable SQL statements to manage multiple versions of data. This topic describes the syntax and scenarios of hints in LindormTable.
Prerequisites
The version of LindormTable is 2.3.1 or later. For more information about how to view or upgrade the version of LindormTable, see Release notes of LindormTable and Upgrade the minor engine version of a Lindorm instance.
Limits
Hints can be used only after the INSERT, UPSERT, DELETE, and SELECT keywords in SQL statements.
If the LindormTable version of your instance is 2.5.2.1 or earlier, hints cannot be used in SQL statements that are executed to perform complex queries, such as subqueries and group queries.
Syntax
hintExpression ::= /*+ hintItems */
hintItems ::= hintItem (',' hintItem )*
hintItem ::= identifier ('(' hintOption ( ',' hintOption)* ')')?
identifier ::= ( [A-Z] | '_' ) ( [A-Z] | [0-9] | '_' | '@' | ':')*
Hints are used in the
/*+ hintItems */
format, in whichhintItems
indicates operation-specific hints. MultiplehintItems
are separated by commas (,).Hints can be used only after the INSERT, UPSERT, DELETE, and SELECT keywords in LindormTable SQL statements. For example, hints in the following statements are invalid:
UPSERT INTO /*+ _l_ts_(3000) */ t_test_ts(c1, c3) VALUES (1, 'c3');
.
Parameters of hintOptions
Parameter | Type | Description |
_l_operation_timeout_ Note This name of this parameter is operationtimeout in Lindorm whose version is earlier than 2.5.2.1. | INT | The timeout period of the DML operation. Default value: 120000. The value of this parameter must be larger than 0. Unit: millisecond. This parameter is applicable only to the hints in UPSERT, DELETE, and SELECT statements. Note _l_operation_timeout_ can be used together with other parameters in a hint. Separate different parameters with commas (,). Example: |
_l_force_index_ | STRING | Specifies that indexes must be used. This parameter is applicable only to the hints in SELECT statements. Note The _l_force_index_ parameter cannot be specified together with the _l_ignore_index_ parameter. |
_l_ignore_index_ | N/A | Specifies that indexes are not used to query data. You can specify this parameter in the hint when you want to compare the performance of between queries that use indexes and queries that do not use indexes. You do not need to specify a value for this parameter when you use it in a hint. This parameter is applicable only to the hints in SELECT statements. Note The _l_ignore_index_ parameter cannot be specified together with the _l_force_index_ parameter. |
_l_allow_filtering_ | N/A | Specifies whether to allow inefficient queries that scan all data in the table. If this parameter is not specified in a query, an error is returned when the WHERE conditions in the query do not contain primary keys. If you specify this parameter in a hint, the query can be executed with no errors reported. You do not need to specify a value for this parameter when you use it in a hint. This parameter is applicable only to the hints in SELECT statements. |
_l_versions_ | INT | Specifies that the latest N versions of the data you query are returned. The value of this parameter must be larger than 0. This parameter is applicable only to the hints in SELECT statements. |
_l_ts_ | BIGINT | The timestamp that indicates the time when data is inserted to non-primary key columns or the time when data in non-primary key columns is queried. The timestamp can be used for data versioning. The value of this parameter must be larger than 0. Unit: milliseconds. This parameter is applicable only to the hints in UPSERT and SELECT statements. |
_l_ts_min_ | BIGINT | The minimum timestamp of the data you want to query. The value of this parameter must be larger than 0. Unit: milliseconds. This parameter is applicable only to the hints in SELECT statements. |
_l_ts_max_ | BIGINT | The maximum timestamp of the data you want to query. The value of this parameter must be larger than 0. Unit: milliseconds. This parameter is applicable only to the hints in SELECT statements. |
_l_hot_only_ | BOOLEAN | Specifies whether only hot data is queried. This parameter is applicable only to the hints in SELECT statements. You can set this parameter to one of the following values:
|
Examples
Example 1: Query the number of rows in a table and set the timeout period of DML operations to 30,000 ms.
SELECT /*+ _l_operation_timeout_(30000) */ COUNT(*) FROM t_test_ts;
The following result is returned:
+----------+ | COUNT(*) | +----------+ | 1 | +----------+
Example 2: Write data to a row in a table and set the timeout period of DML operations to 30,000 ms.
UPSERT /*+ _l_operation_timeout_(30000) */ INTO t_test_ts(c1, c2, c3) values(1,2,3);
Example 3: Delete data that matches the conditions and set the timeout period of DML operations to 30,000 ms.
DELETE /*+ _l_operation_timeout_(30000) */ FROM tb WHERE c1 = 1;
Example 4: Specify _l_force_index_ to forcibly use an index in the query.
SELECT /*+ _l_force_index_('idx1') */ COUNT(*) FROM tb; // 'idx1' indicates the index created for the table.
The following result is returned:
+----------+ | COUNT(*) | +----------+ | 1 | +----------+
Example 5: Specify _l_ignore_index_ to perform the query without using the index.
SELECT /*+ _l_ignore_index_ */ COUNT(*) FROM tb;
The following result is returned:
+----------+ | COUNT(*) | +----------+ | 1 | +----------+
Example 6: Specify _l_allow_filtering_ to allow queries in which primary keys are not contained in the conditions.
SELECT /*+ _l_allow_filtering_ */ COUNT(*) FROM tb WHERE c1 = 2;
The following result is returned:
+----------+ | COUNT(*) | +----------+ | 1 | +----------+
The
c1
column specified in the query condition is not a primary key column nor an index column. No error is returned after you specify the _l_allow_filtering_ parameter in the hint.Example 7: Specify _l_ts_ to configure the timestamp of the data that you want to insert.
UPSERT /*+ _l_ts_(3000) */ INTO t_test_ts(c1, c3) VALUES (1, 'c3');
Example 8: Specify _l_versions_ to query the latest version of data.
SELECT /*+ _l_versions_(1) */ c1, c3, c3_l_ts FROM t_test_ts;
The following result is returned:
+----+----+---------+ | c1 | c3 | c3_l_ts | +----+----+---------+ | 1 | c3 | 3000 | +----+----+---------+
Scenarios
You can use hints in the following scenarios: