aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-09-11 12:05:32 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-09-11 12:26:56 +0300
commit8a55588984e2afd906e301df0f471d50b08914c9 (patch)
tree51eec3b1d1a0478dfc0815a5d1daa05dd64595f2
parentf7014dce27f776085607cadfc5fcfc031e4229c1 (diff)
downloadydb-8a55588984e2afd906e301df0f471d50b08914c9.tar.gz
YQL-13585 Doc for unique/distinct hints.
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/lexer.md11
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/unique_distinct_hints.md23
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/select.md2
3 files changed, 27 insertions, 9 deletions
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/lexer.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/lexer.md
index 62c0ad251c..e402623639 100644
--- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/lexer.md
+++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/lexer.md
@@ -9,7 +9,7 @@
## Режимы совместимости синтаксиса {#lexer-modes}
-Поддерживаются два режима совместимости синтаксиса:
+Поддерживаются два режима совместимости синтаксиса:
* Расширенный C++ (по-умолчанию)
* ANSI SQL
@@ -83,7 +83,7 @@ SQL хинты – это специальные настройки, котор
(например, включать/выключать определенные оптимизации, форсировать стратегию JOIN-а и т.п.).
В отличие от [PRAGMA](../pragma.md), SQL хинты обладают локальным действием – они привязаны к определенной точке YQL запроса (обычно следуют после ключевого слова)
и влияют только на соответствующий statement или даже его часть.
-SQL хинты представляют собой набор настроек "имя-список значений" и задаются внутри комментариев специального вида –
+SQL хинты представляют собой набор настроек "имя-список значений" и задаются внутри комментариев специального вида –
первым символом комментария с SQL хинтами должен быть `+`:
```sql
--+ Name1(Value1 Value2 Value3) Name2(Value4) ...
@@ -108,13 +108,6 @@ SQL хинты представляют собой набор настроек "
--+ foo('value with single quote '' inside')
```
-При наличии в списке хинтов двух (и более) хинтов с одинаковыми именами используется последний:
-```sql
---+ foo(v1 v2) bar(v3) foo()
--- эквивалетно
---+ bar(v3) foo()
-```
-
Неизвестные имена SQL хинтов (либо синтаксически некорректные хинты) никогда не вызывают ошибок – они просто игнорируется:
```sql
--+ foo(value1) bar(value2 baz(value3)
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/unique_distinct_hints.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/unique_distinct_hints.md
new file mode 100644
index 0000000000..f9a6bb7251
--- /dev/null
+++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/unique_distinct_hints.md
@@ -0,0 +1,23 @@
+## UNIQUE DISTINCT hints {#unique_distinct_hints}
+
+Непосредственно после `SELECT` возмоно добавить [SQL хинты](../lexer.md#sql-hints) `unique` или `distinct` которые заявляют, что эта проекция порождает данные, содержащие уникальные значения в указаном наборе колонок. Это может, использоваться для оптимизации следующих подзапросов, выполняющихся над этой проекцией, или для записи в мета-атрибуты таблицы при `INSERT`.
+
+* Колонки указываются в значениях хинта через пробел.
+* Если набор колонок не задан, значит уникальность распостаняется на полный набор колонок этой проекции.
+* `unique` - означает уникальные либо `null` значения. По станларту SQL каждый null уникален: NULL = NULL -> NULL
+* `distinct` - означает полностью уникальные значение включая `null`: NULL IS DISTINCT FROM NULL -> FALSE
+* Можно указать несколько наборов колонок в нескольких хинтах у одной проекции.
+* Если хинт содержит колонку, которой нет в проекции, он будет проигнорирован.
+
+**Примеры**
+
+``` yql
+SELECT /*+ unique() */ * FROM Input;
+SELECT /*+ distinct() */ * FROM Input;
+
+SELECT /*+ distinct(key subkey) */ * FROM Input;
+SELECT /*+ unique(key) distinct(subkey value) */ * FROM Input;
+
+-- Missed column - ignore hint.
+SELECT /*+ unique(subkey value) */ key, value FROM Input;
+```
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/select.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/select.md
index 702897a231..692edf672b 100644
--- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/select.md
+++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/select.md
@@ -26,6 +26,8 @@
{% include [x](_includes/select/distinct.md) %}
+{% include [x](_includes/select/unique_distinct_hints.md) %}
+
{% include [x](_includes/select/execution.md) %}
{% include [x](_includes/select/column_order.md) %}