annagobova commented on code in PR #10983:
URL: https://github.com/apache/ignite/pull/10983#discussion_r1358050935


##########
docs/_docs/SQL/sql-calcite.adoc:
##########
@@ -241,3 +228,150 @@ Below are the data types supported by the Calcite-based 
SQL engine:
 |`java.lang.Object`
 
 |===
+
+== Optimizer hints [[hints]]
+
+The query optimizer does its best to build the fastest excution plan. But it 
is a far way to create an optimizer which
+is the most effective for each case. You may have better knowledge of your 
data design, application design or data
+distribution in the cluster. The SQL hints can help the optimizer to make 
optimizations more rationally or build
+execution plan faster.
+
+[NOTE]
+====
+SQL hints are not mandatory to apply and might be skipped in some cases.
+====
+
+=== Hints format
+Sql hints are defined with the special comment +++/*+ HINT */+++ reffered as 
_hint block_. Spaces before and after the
+hint name are required. Hint block is placed right after a relation operator. 
Usually, after _SELECT_. Several hint
+blocks for one relation operator *are not allowed*.
+
+Example:
+[source, SQL]
+----
+SELECT /*+ NO_INDEX */ T1.* FROM TBL1 where T1.V1=? and T1.V2=?
+----
+
+It is allowed to define several hints for the same relation operator. For 
that, hints are separated with comma
+(spaces are optional).
+
+Example:
+[source, SQL]
+----
+SELECT /*+ NO_INDEX, EXPAND_DISTINCT_AGG */ SUM(DISTINCT V1), AVG(DISTINCT V2) 
FROM TBL1 GROUP BY V3 WHERE V3=?
+----
+
+==== Hint parameters
+Hint parameters, if required, are placed within brackets after the hint name 
and are separated with commas.
+
+Hint parameter can be quoted. Quoted parameter is case sensitive. Quoted and 
unquoted parameters *cannot be*
+defined for the same hint.
+
+Example:
+[source, SQL]
+----
+SELECT /*+ FORCE_INDEX(TBL1_IDX2,TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 
T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;
+
+SELECT /*+ FORCE_INDEX('TBL2_idx1') */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 
WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;
+----
+
+=== Hint scope
+Hints are difined for a relation operator. Usually for _SELECT_. Most of the 
hints are 'visible' for their relation
+operators, for following operators, queries and sub-queries. Hint defined in a 
sub-query are 'visible' only for
+this sub-subery and its sub-queries. Hint is not 'visible' for a preceding 
relation operator if defined after it.
+
+Example:
+[source, SQL]
+----
+SELECT /*+ NO_INDEX(TBL1_IDX2), FORCE_INDEX(TBL2_IDX2) */ T1.V1 FROM TBL1 T1 
WHERE T1.V2 IN (SELECT T2.V2 FROM TBL2 T2 WHERE T2.V1=? AND T2.V2=?);
+
+SELECT T1.V1 FROM TBL1 T1 WHERE T1.V2 IN (SELECT /*+ FORCE_INDEX(TBL2_IDX2) */ 
T2.V2 FROM TBL2 T2 WHERE T2.V1=? AND T2.V2=?);
+----
+
+Note, only the first query has a hint in a case like:
+[source, SQL]
+----
+SELECT /*+ FORCE_INDEX */ V1 FROM TBL1 WHERE V1=? AND V2=?
+UNION ALL
+SELECT V1 FROM TBL1 WHERE V3>?
+----
+
+But *there are exceptions*: hints of engine or optimizer level like 
link:#hint_disable_rule[_DISABLE_RULE_]  or

Review Comment:
   But there are exceptions: hints of engine or optimizer level, such as 
DISABLE_RULE or QUERY_ENGINE. Such hints should be defined at the beginning of 
the query and are related to the whole query.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to