Other hints under the global hint type allow developers and database administrators to perform fine-grained control over the execution of SQL statements. The following table lists the other types of hints supported:
Hint name |
Description |
|---|---|
APPEND |
Collects statistics while performing an INSERT operation. In INSERT INTO SELECT statements, it enables the direct load mode (DIRECT INSERT). |
CURSOR_SHARING_EXACT |
Controls whether queries are parameterized. |
DIRECT |
Enables the direct load feature in LOAD DATA and INSERT statements to improve data import efficiency and performance. |
NO_DIRECT |
Disables the direct load feature in LOAD DATA, INSERT INTO SELECT, and CREATE TABLE AS SELECT statements. |
USE_PX |
Executes SQL statements in PX mode, which allows for multi-threaded execution. |
ENABLE_PARALLEL_DML |
Enables parallel DML. |
DISABLE_PARALLEL_DML |
Disables parallel DML. |
ENABLE_PARALLEL_DAS_DML |
Specifies that the current DML statement must forcibly enable concurrent write optimization using the Distributed Data Access Service (DAS). |
DISABLE_PARALLEL_DAS_DML |
Specifies that the current DML statement must forcibly disable concurrent write optimization using the Distributed Data Access Service (DAS). |
DYNAMIC_SAMPLING |
Enables dynamic sampling. |
LOAD_BATCH_SIZE |
Specifies the batch size for each insert. It is only used in LOAD DATA. |
LOG_LEVEL |
Specifies the log level for the current query during execution. |
MAX_CONCURRENT |
Sets the maximum number of concurrent queries allowed. |
MONITOR |
Enables the capture of SQL Plan Monitor records for the query. |
MV_REWRITE |
When used alone, the MV_REWRITE hint skips the rules and cost checks for materialized view query rewriting and directly uses the applicable rewrite. |
NO_MV_REWRITE |
Disables materialized view query rewriting, and you can specify a query block. |
OPT_PARAM |
Sets optimizer-related parameters at the query level. |
PARALLEL |
Sets the parallelism level for the query. Its opposite operation is NO_PARALLEL. |
NO_PARALLEL |
Disables query parallelism (i.e., sets the parallelism level to 1). |
QUERY_TIMEOUT |
Sets the query execution timeout. |
READ_CONSISTENCY |
Sets the read consistency level (strong/weak). |
RESOURCE_GROUP |
Forces the statement to use a specified resource group. |
STAT |
Tracks the output statistics of query operators. |
TRANS_PARAM |
Sets transaction-related variables at the query level. |
TRACING |
Tracks the output of query execution operators. |
USE_PLAN_CACHE |
Specifies the plan cache (Plan Cache) usage strategy for the current query. |
DISABLE_TRIGGER |
Temporarily disables triggers in the current DML statement. You can specify one or more trigger names in parentheses. If you omit the parentheses and the trigger names, all triggers related to this DML statement are disabled. |
APPEND Hint
The APPEND hint enables the direct load feature for the INSERT INTO SELECT statement. For more information, see Use the INSERT INTO SELECT statement to directly load data.
Syntax
/*+ APPEND */
Examples
INSERT /*+ append enable_parallel_dml parallel(16) */ INTO t2
SELECT * FROM t1;
CURSOR_SHARING_EXACT Hint
The CURSOR_SHARING_EXACT hint specifies that parameterization is disabled at the query level.
OceanBase Database allows you to replace literals in an SQL statement with bind variables. This feature is controlled by the CURSOR_SHARING variable. When cursor_sharing='exact', parameterization is not required. For more information, see cursor_sharing.
Syntax
/*+ CURSOR_SHARING_EXACT */
Examples
The following example shows a query that disables parameterization by using the CURSOR_SHARING_EXACT hint. After executing the query with two sets of parameters four times, two query plans are generated in the plan cache for different parameters.
alter system flush plan cache global;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6;
SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6;
SELECT sql_id, plan_id, statement FROM oceanbase.gv$ob_plan_cache_plan_stat where query_sql like "SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=%";
+----------------------------------+---------+---------------------------------------------------------+
| sql_id | plan_id | statement |
+----------------------------------+---------+---------------------------------------------------------+
| E024EB33213BF501D4CA7ABB81A195B5 | 13249 | SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=5 |
| E024EB33213BF501D4CA7ABB81A195B5 | 13250 | SELECT /*+ CURSOR_SHARING_EXACT */ * FROM t1 WHERE c1=6 |
+----------------------------------+---------+---------------------------------------------------------+
DIRECT Hint
The DIRECT hint enables the direct load feature for the LOAD DATA and INSERT statements, improving the efficiency and performance of data import.
Syntax
The syntax of the DIRECT hint is as follows:
/*+ DIRECT (/*+ direct(need_sort, max_errors_allowed, load_mode) */)*/
Parameters
need_sort: specifies whether to sort the imported data. Valid values:trueandfalse.trueindicates that the data needs to be sorted.falseindicates that the data does not need to be sorted.max_errors_allowed: specifies the maximum number of error rows allowed. If the number of error rows exceeds this value, the import process will fail.load_mode: specifies the import mode. Valid values:full: the default value, indicating a full import.inc: indicating an incremental import, which supports theINSERTandIGNOREsemantics.inc_replace: indicating an incremental import that does not check for duplicate primary keys, equivalent to theREPLACEsemantics of an incremental import.
Examples
DIRECT Hint in LOAD DATA Statements
Enable incremental direct load
LOAD DATA /*+ DIRECT(true, 0, inc) */
INFILE 'datafile.txt'
INTO TABLE mytable
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
In this example, DIRECT(true, 0, inc) enables incremental direct load, sorts the data, and allows up to 0 error rows.
Enable full direct load
LOAD DATA
/*+ PARALLEL(4) DIRECT(true, 0, full) */
REMOTE_OSS INFILE 'oss://example.com/datafile.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
In this example, PARALLEL(4) specifies a parallelism of 4, and DIRECT(true, 0, full) enables full direct load, sorts the data, and allows up to 0 error rows.
For more information, see Direct load.
DIRECT Hint in INSERT INTO SELECT Statements
To enable direct load in INSERT INTO SELECT statements, you must use the enable_parallel_dml option in the format: /*+ direct(bool, int, load_mode)} enable_parallel_dml PARALLEL(N) */.
Enable incremental direct load
-- Enable incremental direct load and parallel DML to incrementally import data from old_table to new_table
INSERT /*+ direct(true, 0, 'inc') enable_parallel_dml PARALLEL(4) */ INTO new_table (id, name, value)
SELECT id, name, value
FROM old_table;
In this example, direct(true, 0, 'inc') enables incremental direct load, sorts the data, and allows up to 0 error rows; enable_parallel_dml enables parallel DML; and PARALLEL(4) sets the parallelism to 4.
Enable full direct load
-- Enable full direct load and parallel DML to import data from old_table to new_table
INSERT /*+ direct(true, 0, 'full') enable_parallel_dml PARALLEL(4) */ INTO new_table (id, name, value)
SELECT id, name, value
FROM old_table;
In this example, direct(true, 0, 'full') enables full direct load, sorts the data, and allows up to 0 error rows; enable_parallel_dml enables parallel DML; and PARALLEL(4) sets the parallelism to 4.
For more information, see Use the INSERT INTO SELECT statement to directly load data.
NO_DIRECT Hint
The NO_DIRECT hint disables the direct load feature in LOAD DATA, INSERT INTO SELECT, and CREATE TABLE AS SELECT statements.
Syntax
The syntax of the NO_DIRECT hint is as follows:
/*+ NO_DIRECT */
Parameters
NO_DIRECT: forces a single SQL statement to not use direct load. If an SQL statement contains this hint, it ignores other direct load hints and executes a regular import.
Examples
Use the
NO_DIRECThint in aLOAD DATAstatementLOAD DATA /*+ NO_DIRECT */ [REMOTE_OSS | LOCAL] INFILE 'file_name' INTO TABLE table_name [COMPRESSION]...Use the
NO_DIRECThint in anINSERT INTO SELECTstatementINSERT /*+ NO_DIRECT */ INTO table_name select_sentenceUse the
NO_DIRECThint in aCREATE TABLE AS SELECTstatementCREATE /*+ NO_DIRECT */ TABLE table_name [AS] select_sentence
DYNAMIC_SAMPLING Hint
The DYNAMIC_SAMPLING hint specifies whether to enable dynamic sampling for a query.
Syntax
/*+ DYNAMIC_SAMPLING ( 0 | 1 ) */
Parameter description
The parameters of the DYNAMIC_SAMPLING hint are described as follows:
- When the parameter is 0, dynamic sampling is disabled.
- When the parameter is 1, dynamic sampling is enabled.
Examples
The following example shows how to enable dynamic sampling by using the DYNAMIC_SAMPLING hint.
SELECT /*+ dynamic_sampling(1) */ *
FROM t1 WHERE c1 LIKE "%abc%" AND c2 LIKE "%abc%";
USE_PX Hint
The USE_PX hint forces the server to execute an SQL statement in parallel execution (PX) mode. PX mode allows an SQL statement to be executed in multiple threads, thereby improving query performance. Typically, the USE_PX hint is used with the PARALLEL hint to specify the number of threads for parallel execution. By default, the system uses the USE_PX hint.
Syntax
The syntax of the USE_PX hint is as follows:
/*+ USE_PX */
Examples
The following example shows how to use the USE_PX hint:
SELECT /*+ USE_PX PARALLEL(4)*/ e.dept_id, sum(e.salary)
FROM emp e
WHERE e.dept_id = 1001 GROUP BY e.dept_id;
ENABLE_PARALLEL_DML Hint
The ENABLE_PARALLEL_DML hint specifies to enable parallel DML for the current query. Its reverse hint is DISABLE_PARALLEL_DML, which is used to disable parallel DML.
For more information, see Parallel DML.
Considerations
When you use
/*+ENABLE_PARALLEL_DML PARALLEL(n)*/, the system first considers using distributed parallel DML (PDML). If the current environment does not support PDML, the system falls back to DAS concurrent write as a performance optimization.If the session-level parallelism is set to a fixed value, the execution behavior remains consistent with the above behavior.
Even if the current environment does not support parallel DML (PDML), if the system parameter
_enable_parallel_das_dmlis set totrueusing theALTER SYSTEM SETcommand (its default value isfalse), the system will not enable DAS (Distributed Active Storage) parallel write operations, even if the/*+ENABLE_PARALLEL_DML PARALLEL(n)*/hint is used.If
_enable_parallel_das_dmlis set totrueusing theALTER SYSTEM SETcommand (default isfalse) and the session-level parallelism is already set to a fixed value, then even if the current environment does not support PDML, using the/*+ENABLE_PARALLEL_DML PARALLEL(n)*/hint will not enable DAS parallel write.
Syntax
/*+ ENABLE_PARALLEL_DML */
Examples
insert /*+ enable_parallel_dml parallel(8) */ into t2 select * from t1;
DISABLE_PARALLEL_DML Hint
The DISABLE_PARALLEL_DML hint specifies to disable parallel DML for the current query. Its reverse hint is ENABLE_PARALLEL_DML, which is used to enable parallel DML.
For more information, see Parallel DML.
Syntax
/*+ DISABLE_PARALLEL_DML */
Examples
insert /*+ disable_parallel_dml parallel(8) */ into t2 select * from t1;
ENABLE_PARALLEL_DAS_DML Hint
The ENABLE_PARALLEL_DAS_DML hint specifies to enable the use of Distributed Data Access Service (DAS) concurrent write optimization for the current DML statement. Its reverse hint is DISABLE_PARALLEL_DAS_DML.
Considerations
The
ENABLE_PARALLEL_DAS_DMLhint must be used with theENABLE_PARALLEL_DMLhint.When the
/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/hint is used, the system will treat DAS concurrent write as a forced option and execute operations based on the parallelism specified byPARALLEL(n).If the system parameter
_enable_parallel_das_dmlis set totrueusing theALTER SYSTEM SETstatement (its default value isfalse), the/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/hint becomes invalid. In this case, the system will not perform DAS parallel write operations.
Syntax
/*+ ENABLE_PARALLEL_DAS_DML */
Examples
insert /*+ ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
DISABLE_PARALLEL_DAS_DML Hint
The DISABLE_PARALLEL_DAS_DML hint specifies to disable the use of Distributed Data Access Service (DAS) concurrent write optimization for the current DML statement. Its reverse hint is ENABLE_PARALLEL_DAS_DML.
Considerations
The
DISABLE_PARALLEL_DAS_DMLhint must be used with theENABLE_PARALLEL_DMLhint.When the
/*+DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/hint is used, the system will disable DAS concurrent write, even if other concurrent write optimization options such as PDML are enabled.
Syntax
/*+ DISABLE_PARALLEL_DAS_DML */
Examples
insert /*+ DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
LOAD_BATCH_SIZE Hint
The LOAD_BATCH_SIZE hint specifies the size of the batch of records to be inserted in each LOAD DATA statement.
In the LOAD_BATCH_SIZE hint, the batch_size parameter specifies the size of the batch of records to be inserted in each LOAD DATA statement. For more information about LOAD DATA, see LOAD DATA statement.
Syntax
/*+ LOAD_BATCH_SIZE ( batch_size ) */
Examples
-- Use four parallel processes to import data, appending new data to the end of the table, and set each batch to process 1000 records using the `LOAD_BATCH_SIZE` hint.
LOAD DATA /*+ PARALLEL(4) APPEND LOAD_BATCH_SIZE(1000) */
INFILE '/home/admin/test.csv' INTO TABLE t1;
LOG_LEVEL Hint
The LOG_LEVEL hint specifies the log level for the current query.
In the LOG_LEVEL hint, the log_level parameter specifies the log level. Common log levels include ERROR, WARN, INFO, TRACE, and DEBUG.
For more information about log levels, see Log levels.
Syntax
/*+ LOG_LEVEL ( [']log_level['] ) */
Examples
-- Use the `LOG_LEVEL` hint to specify the `TRACE` log level.
SELECT /*+ LOG_LEVEL(TRACE) */ *
FROM employees e
WHERE e.department_id = 1001;
MAX_CONCURRENT Hint
The MAX_CONCURRENT hint specifies the maximum number of concurrent queries allowed.
In the MAX_CONCURRENT hint, the intnum parameter specifies the maximum number of concurrent queries allowed. If the number of concurrent queries exceeds the allowed maximum, an error is returned when the query is executed. If intnum is set to 0, an error is always returned when the query is executed.
Note that currently, the MAX_CONCURRENT hint cannot be directly used in queries. Instead, you can create an outline containing only the MAX_CONCURRENT hint to limit the concurrency of specific SQL statements with a given SQL_ID.
Syntax
/*+ MAX_CONCURRENT ( intnum ) */
Examples
-- This query creates an outline named otl1 associated with the identifier 'EC102CB006383D732BC98797601D9B3B' and specifies a maximum of 10 concurrent executions for the corresponding query.
CREATE OUTLINE otl1 ON 'EC102CB006383D732BC98797601D9B3B'
USING HINT /*+ max_concurrent(10) */;
MONITOR Hint
The MONITOR hint enables capturing the execution process of the query in the SQL Plan Monitor. You can use the MONITOR hint to record the execution process of the query in the SQL Plan Monitor.
For queries that do not use parallel execution, OceanBase Database does not record their execution process in the SQL Plan Monitor.
For more information about the SQL Plan Monitor, see the Real-time SQL Plan Monitor section in Display real-time execution plans.
Syntax
/*+ MONITOR */
Examples
-- Use the `MONITOR` hint to enable the SQL Plan Monitor.
SELECT /*+monitor*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
Hint for query rewriting on materialized views
The query rewriting on materialized views is controlled by the MV_REWRITE and NO_MV_REWRITE hints. These hints take precedence over the system variable query_rewrite_enabled.
MV_REWRITE Hint
The syntax of the MV_REWRITE hint is as follows:
/*+ MV_REWRITE (@ queryblock [mv_name_list]) */
mv_name_list:
mv_name [, mv_name ...]
When you use the MV_REWRITE hint alone, it skips the rules and cost checks for query rewriting on materialized views and directly applies the applicable rewrite. If you specify one or more materialized views after the hint, it skips the rules and cost checks and only uses the specified materialized views for rewriting, ignoring any unspecified materialized views.
When you use the MV_REWRITE hint to specify materialized views, you cannot force the use of a materialized view that does not have the ENABLE QUERY REWRITE clause. Additionally, you cannot force the use of a non-real-time materialized view when the system variable query_rewrite_integrity is set to enforced.
NO_MV_REWRITE Hint
The syntax of the NO_MV_REWRITE hint is as follows:
/*+ NO_MV_REWRITE (@ queryblock) */
The NO_MV_REWRITE hint disables query rewriting on materialized views and allows you to specify a query block.
Example of using the query rewriting on materialized views control hints
Create the base table
tbl2.CREATE TABLE tbl2 (col1 INT, col2 INT);Insert two rows into the
tbl2table.INSERT INTO tbl2 VALUES (1,2),(3,4);The return result is as follows:
Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0Create the materialized view
mv1_tbl2and enable query rewriting on it.CREATE MATERIALIZED VIEW mv1_tbl2 NEVER REFRESH ENABLE QUERY REWRITE AS SELECT * FROM tbl2;Create the materialized view
mv2_tbl2and enable query rewriting on it.CREATE MATERIALIZED VIEW mv2_tbl2 NEVER REFRESH ENABLE QUERY REWRITE AS SELECT * FROM tbl2 WHERE tbl2.col1 > 1;Set the system variable
query_rewrite_integritytostale_tolerated.Note
The
MV_REWRITEandNO_MV_REWRITEhints take precedence over the system variablequery_rewrite_enabled, so you do not need to setquery_rewrite_enabled. However, you must setquery_rewrite_integritytostale_toleratedto use non-real-time materialized views for rewriting.SET query_rewrite_integrity = 'stale_tolerated';Use the
MV_REWRITEhint to attempt query rewriting on materialized views and skip the cost and rule checks. The following two queries will both use themv1_tbl2materialized view for rewriting./*+mv_rewrite*/will attempt to use a materialized view that meets the rewrite conditions for rewriting. Once a suitable materialized view is found, subsequent materialized views will be ignored, and the cost and rule checks will be skipped.EXPLAIN SELECT /*+mv_rewrite*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;The return result is as follows:
+----------------------------------------------------------------------------------------------+ | Query Plan | +----------------------------------------------------------------------------------------------+ | ===================================================== | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ----------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|MV1_TBL2|1 |3 | | | ===================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [MV1_TBL2.COL1]), filter(nil), rowset=16 | | group([MV1_TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([MV1_TBL2.COL1]), filter([MV1_TBL2.COL1 > cast(1, NUMBER(-1, -85))]), rowset=16 | | access([MV1_TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([MV1_TBL2.__pk_increment]), range(MIN ; MAX)always true | +----------------------------------------------------------------------------------------------+ 14 rows in set/*+mv_rewrite(mv1_tbl2)*/will attempt to use themv2_tbl2materialized view for rewriting and skip the cost and rule checks.EXPLAIN SELECT /*+mv_rewrite(mv2_tbl2)*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;The return result is as follows:
+-------------------------------------------------------------------------+ | Query Plan | +-------------------------------------------------------------------------+ | ===================================================== | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ----------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|MV2_TBL2|1 |3 | | | ===================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [MV2_TBL2.COL1]), filter(nil), rowset=16 | | group([MV2_TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([MV2_TBL2.COL1]), filter(nil), rowset=16 | | access([MV2_TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, | | range_key([MV2_TBL2.__pk_increment]), range(MIN ; MAX)always true | +-------------------------------------------------------------------------+ 14 rows in set
Although the query specifies using
mv2_tbl2for rewriting, theWHEREcondition in the query does not meet the requirements, somv2_tbl2cannot be used for query rewriting. Therefore, no materialized view query rewriting is performed.EXPLAIN SELECT /*+mv_rewrite(mv2_tbl2)*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 < 1 GROUP BY col1;The return result is as follows:
+--------------------------------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------------------------------+ | ================================================= | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|TBL2|1 |3 | | | ================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [TBL2.COL1]), filter(nil), rowset=16 | | group([TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([TBL2.COL1]), filter([TBL2.COL1 < cast(1, NUMBER(-1, -85))]), rowset=16 | | access([TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([TBL2.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------+ 14 rows in setUse the
/*+ no_mv_rewrite*/hint to disable query rewriting on materialized views.EXPLAIN SELECT /*+no_mv_rewrite*/ count(*), col1 FROM tbl2 WHERE tbl2.col1 > 1 GROUP BY col1;The return result is as follows:
+--------------------------------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------------------------------+ | ================================================= | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ------------------------------------------------- | | |0 |HASH GROUP BY | |1 |3 | | | |1 |└─TABLE FULL SCAN|TBL2|1 |3 | | | ================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)], [TBL2.COL1]), filter(nil), rowset=16 | | group([TBL2.COL1]), agg_func([T_FUN_COUNT(*)]) | | 1 - output([TBL2.COL1]), filter([TBL2.COL1 > cast(1, NUMBER(-1, -85))]), rowset=16 | | access([TBL2.COL1]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false], | | range_key([TBL2.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------+ 14 rows in set
NO_PARALLEL Hint
The NO_PARALLEL hint specifies to disable query parallelism (i.e., set the parallelism to 1). Its opposite hint is the PARALLEL hint.
The NO_PARALLEL hint is equivalent to /*+ parallel(1)*/.
Syntax
/*+ NO_PARALLEL */
Example
The following query example uses the NO_PARALLEL hint to disable query parallelism.
SELECT /*+ no_parallel */ c1, sum(distinct c2) FROM t1 GROUP BY c1;
NO_QUERY_TRANSFORMATION Hint
The NO_QUERY_TRANSFORMATION hint disables any query rewriting for the current query.
Note that unlike the NO_REWRITE hint in the Query Block Hint, using the NO_QUERY_TRANSFORMATION hint prevents the use of Query Block hints to enable certain types of rewriting.
For more information about query rewriting, see Overview of query rewriting.
Syntax
/*+ NO_QUERY_TRANSFORMATION */
Example
The following query example uses the NO_QUERY_TRANSFORMATION hint to disable any query rewriting.
SELECT /*+ NO_QUERY_TRANSFORMATION */ *
FROM (SELECT * FROM t1) v WHERE v.c1 = 3;
OPT_PARAM Hint
OPT_PARAM Hint specifies optimizer-related configurations or system variables at the query level.
Syntax
/*+ OPT_PARAM ( parameter_name [,] parameter_value ) */
Parameters
parameter_name: the name of a configuration or system variable.parameter_value: the value to be specified for the variable.
The OPT_PARAM Hint is applicable to the following parameters:
rowsets_enabled: specifies whether to enable or disable vectorization. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').rowsets_max_rows: specifies the number of rows to be returned in batches. The data type isINT, and the value ranges from 0 to 65535. Do not enclose the value in single quotation marks (' ').enable_newsort: specifies whether to enable or disable the newsort optimization. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').use_part_sort_mgb: specifies whether to enable or disable the part sort merge group by. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').enable_in_range_optimization: specifies whether to enable or disable the in optimization. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').xsolapi_generate_with_clause: specifies whether to enable or disable the CTE extraction rewrite. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').preserve_order_for_pagination: specifies whether to add anorder byclause to a pagination query to preserve order or to prohibit adding theorder byclause. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').storage_card_estimation: specifies whether to use the row estimation based on the storage layer. The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').workarea_size_policy: specifies the strategy for manually or automatically adjusting the size of the SQL work area. The data type isVARCHAR, and the value can be'MANUAL'for manual adjustment or'AUTO'for automatic adjustment. Enclose the value in single quotation marks (' ').enable_rich_vector_format: specifies whether to enable or disable vectorization 2.0 (session-level parameter). The data type isVARCHAR, and the value can be'TRUE'or'FALSE'. Enclose the value in single quotation marks (' ').spill_compression_codec: specifies the compression algorithm for the operators that need to be temporarily materialized. The data type isVARCHAR, and the value can beNONE,LZ4,SNAPPY,ZLIB, orZSTD, representing different compression algorithms. The default value isNONE, indicating no compression.inlist_rewrite_threshold: specifies the maximum number of constants that can trigger the rewrite of aninlistclause into avalues statement. The data type isINT64, and the value ranges from 1 to 2147483647.orc_filter_pushdown_level: specifies the level at which to push down filter conditions for ORC external tables. The value ofparameter_valuecan be:Note
The
OPT_PARAMHint in OceanBase Database supports theorc_filter_pushdown_levelparameter starting from V4.4.0.0: disables filter condition pushing down.1: pushes down filter conditions to the file level.2: pushes down filter conditions to the stripe level.3: pushes down filter conditions to the row index level.4: pushes down filter conditions to the encoding level.
parquet_filter_pushdown_level: specifies the level at which to push down filter conditions for Parquet external tables. The value ofparameter_valuecan be:Note
The
OPT_PARAMHint in OceanBase Database supports theparquet_filter_pushdown_levelparameter starting from V4.4.0.0: disables filter condition pushing down.1: pushes down filter conditions to the file level.2: pushes down filter conditions to the RowGroup level.3: pushes down filter conditions to the page level.4: pushes down filter conditions to the encoding level.
Examples
The following example uses the OPT_PARAM Hint to enable IN optimization for the current query by specifying the enable_in_range_optimization value.
SELECT /*+ opt_param('enable_in_range_optimization', 'true') */ *
from t1
where c1 in (1,2,3,4,5,...,1000)
and c2 in (1,2,3,4,5,...,1000);
PARALLEL Hint
As a global hint, the PARALLEL Hint specifies the parallelism or parallelism strategy for the current query.
In addition to being a global hint, the PARALLEL Hint can also be used as a query block hint to specify the parallelism at the table level. For more information, see the Parallel hint in Access Path Hints.
Syntax
/*+ PARALLEL ( AUTO | MANUAL | parallel_degree) */
Parameters
AUTOorMANUAL: whenAUTOorMANUALis used as the parameter in thePARALLELHint, it specifies the parallelism strategy. For more information, see Parallelism strategies and their priorities.parallel_degree: whenparallel_degreeis used as the parameter in thePARALLELHint, it specifies the parallelism.
Examples
The following example uses the PARALLEL Hint to specify a parallelism of DOP = 8 or to enable Auto DOP.
SELECT /*+parallel(8)*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
SELECT /*+parallel(auto)*/ c1, SUM(distinct c2) FROM t1 GROUP BY c1;
Note: Some scenarios do not support parallel execution. Even if you specify the PARALLEL hint to enable parallel execution, the execution plan may still disable parallel execution.
QUERY_TIMEOUT Hint
The QUERY_TIMEOUT hint specifies the execution timeout period for the current query.
Syntax
/*+ QUERY_TIMEOUT ( time_usec ) */
Parameters
time_usec: specifies the query timeout period, in microseconds.
Examples
-- Specifies the query timeout period as 1 second. If the query is not completed within the specified timeout period, a timeout error is returned.
SELECT /*+ QUERY_TIMEOUT(1000000) */ *
FROM employees e
WHERE e.department_id = 1001;
READ_CONSISTENCY Hint
The READ_CONSISTENCY hint specifies the read consistency level for the current query.
Syntax
/*+ READ_CONSISTENCY(WEAK[STRONG]) */
Parameters
WEAK: enables weak consistency, which means weak reads are enabled.STRONG: enables strong consistency, which means weak reads are disabled.
Examples
-- Uses the READ_CONSISTENCY hint and sets it to WEAK to enable weak reads for the query.
SELECT /*+ READ_CONSISTENCY(WEAK) */ *
FROM employees
WHERE employees.department_id = 1001;
Weak reads are supported when the isolation level is set to Repeatable Read or Serializable. Example:
obclient> SET transaction read only;
Query OK, 0 rows affected (0.001 sec)
obclient> SELECT /*+ read_consistency(weak)*/ * FROM t WHERE a=2;
+------+------+
| ID | A |
+------+------+
| NULL | 2 |
+------+------+
1 row in set (0.001 sec)
RESOURCE_GROUP Hint
The RESOURCE_GROUP hint forces the statement to use the specified resource group.
Syntax
The syntax of the RESOURCE_GROUP hint is as follows:
/*+ RESOURCE_GROUP ('resource_group_name') */
Parameters
resource_group_name: specifies the name of the resource group to be used.
Examples
Here is an example of using the RESOURCE_GROUP hint:
obclient> SELECT /*+ RESOURCE_GROUP('big_group') */ * FROM t1;
If the resource group big_group does not exist, the current default resource group is used.
STAT Hint
The STAT hint specifies the operators whose outputs are to be traced in the query plan.
After the STAT hint is added, the query plan includes a MONITORING DUMP operator that directly outputs all data from the sort operator and prints the operator's execution time, output rows, and other information in the observer log after execution.
Syntax
/*+ STAT(TRACING_NUM_LIST) */
Parameters
TRACING_NUM_LIST: specifies the IDs of the operators to be traced.
Examples
-- Displays the execution plans before and after adding the `/*+ STAT(0, 2) */` hint.
explain basic
SELECT /*+leading(t1) use_hash(t2)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Query Plan
===========================
|ID|OPERATOR |NAME|
---------------------------
|0 |HASH JOIN | |
|1 |├─TABLE FULL SCAN|T1 |
|2 |└─TABLE FULL SCAN|T2 |
===========================
explain basic
SELECT /*+leading(t1) use_hash(t2) stat(0, 2)*/ *
FROM t1, t2 where t1.c1 = t2.c1;
Query Plan
===============================
|ID|OPERATOR |NAME|
-------------------------------
|0 |MONITORING DUMP | |
|1 |└─HASH JOIN | |
|2 | ├─TABLE FULL SCAN |T1 |
|3 | └─MONITORING DUMP | |
|4 | └─TABLE FULL SCAN|T2 |
===============================
TRANS_PARAM Hint
The TRANS_PARAM hint specifies transaction-related parameters at the query level.
Syntax
/*+ TRANS_PARAM ['FORCE_EARLY_LOCK_FREE' , 'TRUE'] */
Parameters
Currently, only the FORCE_EARLY_LOCK_FREE parameter is supported at the transaction level.
FORCE_EARLY_LOCK_FREE: specifies whether to enable early row lock release. Valid values: TRUE (enabled) and FALSE (disabled).
Notice: The parameter name and value must be enclosed in single quotation marks ('). If the value is a number, you can omit the quotation marks.
Examples
-- Uses the TRANS_PARAM hint and sets the parameter 'FORCE_EARLY_LOCK_FREE' to 'TRUE' to enable early row lock release at the transaction level.
SELECT /*+ TRANS_PARAM('FORCE_EARLY_LOCK_FREE' 'TRUE') */ *
FROM employees e
WHERE e.department_id = 1001;
TRACING Hint
The TRACING hint specifies the operators whose outputs are to be traced in the query plan.
The usage of the TRACING hint, the plan after adding the hint, and the usage of the STAT hint are the same.
The difference between using the TRACING hint and the STAT hint is that the MONITORING DUMP operator prints all of its output data in the observer log when the TRACING hint is used.
Syntax
/*+ TRACING(TRACING_NUM_LIST)*/
Parameters
TRACING_NUM_LIST: specifies the IDs of the operators to be traced.
Examples
-- Uses the TRACING hint and sets the level to 1 to enable tracing for the current query.
SELECT /*+ TRACING(1) */ *
FROM employees e
WHERE e.department_id = 1001;
USE_PLAN_CACHE Hint
The USE_PLAN_CACHE hint specifies the plan cache strategy for the current query. For more information about plan cache, see Execution plan cache.
Syntax
/*+ USE_PLAN_CACHE ( NONE | DEFAULT ) */
Parameters
NONE: specifies that the query does not use the plan cache.DEFAULT: specifies that the current query uses the system variableob_enable_plan_cacheto control the plan cache strategy.
Examples
-- Use the `NONE` parameter to specify that the query does not use the plan cache, and use the `DEFAULT` parameter to specify that the current query uses the system variable `ob_enable_plan_cache` to control the plan cache strategy.
SELECT /*+ USE_PLAN_CACHE(NONE) */ *
FROM employees e
WHERE e.department_id = 1001;
SELECT /*+ USE_PLAN_CACHE(DEFAULT) */ *
FROM employees e
WHERE e.department_id = 1001;
DISABLE_TRIGGER Hint
The DISABLE_TRIGGER hint temporarily disables triggers during the execution of the current DML statement. It applies to INSERT, UPDATE, DELETE, and DML operations on views (including INSTEAD OF triggers).
Syntax
You can use DISABLE_TRIGGER alone or follow it with a pair of parentheses, listing the trigger names (separated by commas) inside. Use parentheses, not brackets.
/*+ disable_trigger */
/*+ disable_trigger ( trigger_name [, trigger_name ... ] ) */
Parameters
trigger_name: an optional parameter specifying the name of the trigger to temporarily disable. You can specify one or more trigger names, separated by commas. If omitted, all triggers involved in the query are disabled by default.
Examples
-- Disable only the trigger named test_trigger1.
INSERT /*+ DISABLE_TRIGGER (test_trigger1) */ INTO test VALUES (2);
-- Disable all triggers related to this DML statement.
INSERT /*+ DISABLE_TRIGGER */ INTO test VALUES (3);
-- Specify multiple triggers.
UPDATE /*+ DISABLE_TRIGGER (tg_a, tg_b) */ t1 SET c = c + 1 WHERE id = 1;
