diff options
author | Ivan Katkov <44121163+Pseudolukian@users.noreply.github.com> | 2024-10-01 08:24:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-30 23:24:27 -0700 |
commit | 1010f452be9bc5fcdb80b8b39eb0a9e6ce6aa40e (patch) | |
tree | 6bbe6b90ba561165459e5d6f9cb87b247e105275 | |
parent | 79db2f2626e86d76c2a74007b63c6a1b66b12d6a (diff) | |
download | ydb-1010f452be9bc5fcdb80b8b39eb0a9e6ce6aa40e.tar.gz |
Add OLAP info to dev section (#6565)
Co-authored-by: Ivan Blinkov <ivan@ydb.tech>
31 files changed, 249 insertions, 156 deletions
diff --git a/ydb/docs/ru/core/_includes/not_allow_for_olap_note_main.md b/ydb/docs/ru/core/_includes/not_allow_for_olap_note_main.md new file mode 100644 index 00000000000..03929e336dc --- /dev/null +++ b/ydb/docs/ru/core/_includes/not_allow_for_olap_note_main.md @@ -0,0 +1,5 @@ +{% note alert %} + +{% include [not_allow_for_olap_text](not_allow_for_olap_text.md) %} + +{% endnote %}
\ No newline at end of file diff --git a/ydb/docs/ru/core/_includes/ways_add_data_to_olap.md b/ydb/docs/ru/core/_includes/ways_add_data_to_olap.md index 57ceafcb2ab..3b8febbdfc6 100644 --- a/ydb/docs/ru/core/_includes/ways_add_data_to_olap.md +++ b/ydb/docs/ru/core/_includes/ways_add_data_to_olap.md @@ -6,4 +6,4 @@ * [Пакетная вставка данных](../recipes/ydb-sdk/bulk-upsert.md) * [Yandex Data Transfer](https://yandex.cloud/ru/services/data-transfer) -{% endif %} +{% endif %}
\ No newline at end of file diff --git a/ydb/docs/ru/core/dev/cdc.md b/ydb/docs/ru/core/dev/cdc.md index 1fb7f13c80a..4fe657a8990 100644 --- a/ydb/docs/ru/core/dev/cdc.md +++ b/ydb/docs/ru/core/dev/cdc.md @@ -1,6 +1,8 @@ # Change Data Capture -[Change Data Capture](../concepts/cdc.md) (CDC) позволяет отслеживать изменения данных в таблицах. {{ ydb-short-name }} предоставляет доступ к потоку изменений, тем самым потребители данных могут отслеживать происходящие изменения почти в реальном времени. +{% include [not_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %} + +[Change Data Capture](../concepts/cdc.md) (CDC) позволяет отслеживать изменения данных в строковых таблицах. {{ ydb-short-name }} предоставляет доступ к потоку изменений, тем самым потребители данных могут отслеживать происходящие изменения почти в реальном времени. ## Включение и выключение CDC {#add-drop} @@ -11,16 +13,16 @@ CDC представлен объектом схемы данных — пото Для чтения данных можно воспользоваться [SDK](../reference/ydb-sdk/) или [{{ ydb-short-name }} CLI](../reference/ydb-cli/). Как и к любому другому объекту схемы данных, к потоку изменений можно обратиться по его пути, который формируется следующим образом: ```txt -путь/до/таблицы/имя_потока_данных +путь/до/строковой_таблицы/имя_потока_данных ``` ->Например, если у таблицы `table` в директории `my` есть поток изменений с именем `updates_feed`, то путь к нему будет выглядеть так: +>Например, если у строковой таблицы `table` в директории `my` есть поток изменений с именем `updates_feed`, то путь к нему будет выглядеть так: > >```text >my/table/updates_feed >``` -Прежде чем приступить к чтению данных, необходимо добавить [потребителя данных (consumer)](../concepts/topic.md#consumer). Ниже приведен пример команды, которая добавит потребителя данных с именем `my_consumer` в поток данных с именем `updates_feed` таблицы `table` в директории `my`: +Прежде чем приступить к чтению данных, необходимо добавить [потребителя данных (consumer)](../concepts/topic.md#consumer). Ниже приведен пример команды, которая добавит потребителя данных с именем `my_consumer` в поток данных с именем `updates_feed` строковой таблицы `table` в директории `my`: ```bash {{ ydb-cli }} topic consumer add \ @@ -38,9 +40,9 @@ CDC представлен объектом схемы данных — пото --wait ``` -## Влияние на производительность записи в таблицы {#performance-considerations} +## Влияние на производительность записи в строковой таблицы {#performance-considerations} -При записи в таблицу с включенным CDC возникают дополнительные накладные расходы на следующие операции: +При записи в строковую таблицу с включенным CDC возникают дополнительные накладные расходы на следующие операции: * формирование записи и сохранение ее в поток изменений; * хранением записей в потоке изменений; @@ -50,7 +52,7 @@ CDC представлен объектом схемы данных — пото В реальных сценариях включение CDC практически не влияет время выполнения запросов (вне зависимости от режима), так как почти все данные, необходимые для формирования записей, находятся в кеше, а сами записи отправляются в топик асинхронно. Однако, фоновая активность по отправке записей незначительно (на 1–10%) увеличивает потребление CPU. -При создании потока изменений для таблицы количество партиций его хранилища (топика) определяется на основании текущего количества партиций таблицы. Если количество партиций исходной таблицы значительно изменяется (например, после загрузки большого объёма данных, или в результате интенсивных обращений), то возникает дисбаланс между партициями таблицы и партициями топика. Такой дисбаланс также может приводить к увеличению времени исполнения запросов на модификацию данных в таблице, либо к излишним накладным расходам на хранение потока изменений. Для устранения дисбаланса можно пересоздать поток изменений. +При создании потока изменений для строковой таблицы количество партиций его хранилища (топика) определяется на основании текущего количества партиций таблицы. Если количество партиций исходной таблицы значительно изменяется (например, после загрузки большого объёма данных, или в результате интенсивных обращений), то возникает дисбаланс между партициями таблицы и партициями топика. Такой дисбаланс также может приводить к увеличению времени исполнения запросов на модификацию данных в таблице, либо к излишним накладным расходам на хранение потока изменений. Для устранения дисбаланса можно пересоздать поток изменений. ## Нагрузочное тестирование {#workload} diff --git a/ydb/docs/ru/core/dev/custom-attributes.md b/ydb/docs/ru/core/dev/custom-attributes.md index 9c9ad0f46da..4400704078b 100644 --- a/ydb/docs/ru/core/dev/custom-attributes.md +++ b/ydb/docs/ru/core/dev/custom-attributes.md @@ -1,5 +1,7 @@ # Пользовательские атрибуты таблиц +{% include [no_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %} + Вы можете хранить произвольную информацию в [пользовательских атрибутах](../concepts/datamodel/table.md#users-attr) и обрабатывать ее в приложении, а также с помощью CLI. Например, приложение использует таблицу в БД. В пользовательских атрибутах хранится версия схемы таблицы. При изменении схемы таблицы необходимо выполнить миграцию данных. Чтобы приложение при старте не применило миграцию, которая уже была выполнена, а также не забыло про миграцию, которую нужно применить, нужно проверить версию схемы в пользовательских атрибутах: diff --git a/ydb/docs/ru/core/dev/example-app/_includes/example-dotnet.md b/ydb/docs/ru/core/dev/example-app/_includes/example-dotnet.md index 5ef9020d14e..eb945da812a 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/example-dotnet.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/example-dotnet.md @@ -90,6 +90,7 @@ await queryClient.Exec(@" Для чтения YQL-запросов используется методы `queryClient.ReadRow` или `queryClient.ReadAllRows`. SDK позволяет в явном виде контролировать выполнение транзакций и настраивать необходимый режим выполнения транзакций с помощью класса `TxMode`. Во фрагменте кода, приведенном ниже, используется транзакция с режимом `NoTx` и автоматическим коммитом после выполнения запроса. Значения параметров запроса передаются в виде словаря имя-значение в аргументе `parameters`. + ```c# var row = await queryClient.ReadRow(@" SELECT diff --git a/ydb/docs/ru/core/dev/example-app/_includes/example-nodejs.md b/ydb/docs/ru/core/dev/example-app/_includes/example-nodejs.md index 6cdca59eb76..77dda9ee859 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/example-nodejs.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/example-nodejs.md @@ -27,7 +27,7 @@ await driver.tableClient.withSession(async (session) => { {% include [create_table.md](steps/02_create_table.md) %} -Для создания таблиц используется метод `Session.createTable()`: +Для создания строковых таблиц используется метод `Session.createTable()`: ```ts async function createTables(session: Session, logger: Logger) { @@ -108,7 +108,9 @@ async function createTables(session: Session, logger: Logger) { } ``` -С помощью метода `Session.describeTable()` можно вывести информацию о структуре таблицы и убедиться, что она успешно создалась: +Метод `Session.createTable()` не позволяет создавать колоночные таблицы. Это можно сделать с помощью метода `Session.executeQuery()`, который выполняет YQL-запросы. + +Если вы создали строковую таблицу и хотите вывести информацию о её структуре и убедиться, что она успешно создалась, воспользуйтесь методом `Session.describeTable()`: ```ts async function describeTable(session: Session, tableName: string, logger: Logger) { diff --git a/ydb/docs/ru/core/dev/example-app/_includes/example-php.md b/ydb/docs/ru/core/dev/example-app/_includes/example-php.md index fc845474d50..4e59dfcdff3 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/example-php.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/example-php.md @@ -36,7 +36,7 @@ $ydb = new Ydb($config); {% include [create_table.md](steps/02_create_table.md) %} -Для создания таблиц используется метод `session->createTable()`: +Для создания строковых таблиц используется метод `session->createTable()`: ```php protected function createTabels() @@ -93,7 +93,9 @@ protected function createTabels() } ``` -С помощью метода `session->describeTable()` можно вывести информацию о структуре таблицы и убедиться, что она успешно создалась: +Метод `session->createTable()` не позволяет создавать колоночные таблицы. Это можно сделать с помощью метода `session->query()`, который выполняет YQL-запросы. + +Если вы создали строковую таблицу и хотите вывести информацию о её структуре и убедиться, что она успешно создалась, воспользуйтесь методом`session->describeTable()`: ```php protected function describeTable($table) diff --git a/ydb/docs/ru/core/dev/example-app/_includes/index.md b/ydb/docs/ru/core/dev/example-app/_includes/index.md index 56ec602a45a..26ad31812f8 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/index.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/index.md @@ -33,7 +33,7 @@ {% include [query_processing.md](steps/04_query_processing.md) %} -{% if oss %}[C++](../example-cpp.md#query-processing) | {% endif %} [C# (.NET)](../example-dotnet.md#query-processing) | [Go](../go/index.md#query-processing) | [Java](../java/index.md#query-processing) | Node.js | P[PHP](../example-php.md#query-processing) | [Python](../python/index.md#query-processing) +{% if oss %}[C++](../example-cpp.md#query-processing) | {% endif %} [C# (.NET)](../example-dotnet.md#query-processing) | [Go](../go/index.md#query-processing) | [Java](../java/index.md#query-processing) | Node.js | [PHP](../example-php.md#query-processing) | [Python](../python/index.md#query-processing) {% include [param_queries.md](steps/06_param_queries.md) %} diff --git a/ydb/docs/ru/core/dev/example-app/_includes/steps/02_create_table.md b/ydb/docs/ru/core/dev/example-app/_includes/steps/02_create_table.md index 38f3c112416..de420beeb51 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/steps/02_create_table.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/steps/02_create_table.md @@ -1,7 +1,7 @@ -## Создание таблиц {#create-table} +## Создание строковых таблиц {#create-table} -Выполняется создание таблиц, которые используются в дальнейших операциях тестового приложения. В результате исполнения шага в базе данных будут созданы таблицы модели данных справочника сериалов: +Выполняется создание строковых таблиц, которые используются в дальнейших операциях тестового приложения. В результате исполнения шага в базе данных будут созданы строковые таблицы модели данных справочника сериалов: - `series` - Сериалы - `seasons` - Сезоны diff --git a/ydb/docs/ru/core/dev/example-app/_includes/steps/03_write_queries.md b/ydb/docs/ru/core/dev/example-app/_includes/steps/03_write_queries.md index 427deb6102a..926684185dc 100644 --- a/ydb/docs/ru/core/dev/example-app/_includes/steps/03_write_queries.md +++ b/ydb/docs/ru/core/dev/example-app/_includes/steps/03_write_queries.md @@ -1,3 +1,3 @@ ## Запись данных {#write-queries} -Выполняется запись данных в созданные таблицы с использованием команды [`UPSERT`](../../../../yql/reference/syntax/upsert_into.md) языка запросов [YQL](../../../../yql/reference/index.md). Применяется режим передачи запроса на изменение данных с автоматическим подтверждением транзакции в одном запросе к серверу. +Выполняется запись данных в созданные строковые таблицы с использованием команды [`UPSERT`](../../../../yql/reference/syntax/upsert_into.md) языка запросов [YQL](../../../../yql/reference/index.md). Применяется режим передачи запроса на изменение данных с автоматическим подтверждением транзакции в одном запросе к серверу. diff --git a/ydb/docs/ru/core/dev/example-app/go/index.md b/ydb/docs/ru/core/dev/example-app/go/index.md index 6eae4106f04..5ef0a79c6b5 100644 --- a/ydb/docs/ru/core/dev/example-app/go/index.md +++ b/ydb/docs/ru/core/dev/example-app/go/index.md @@ -73,7 +73,7 @@ defer db.Close(ctx) {% include [steps/02_create_table.md](../_includes/steps/02_create_table.md) %} -Для создания таблиц используется метод `table.Session.CreateTable()`: +Для создания строковых таблиц используется метод `table.Session.CreateTable()`: ```go err = db.Table().Do(ctx, @@ -93,7 +93,9 @@ if err != nil { } ``` -С помощью метода `table.Session.DescribeTable()` можно вывести информацию о структуре таблицы и убедиться, что она успешно создалась: +Метод `table.Session.CreateTable()` не позволяет создавать колоночные таблицы. Это можно сделать с помощью метода `table.Session.Execute()`, который выполняет YQL-запросы. + +Если вы создали строковую таблицу и хотите вывести информацию о её структуре и убедиться, что она успешно создалась, воспользуйтесь методом `table.Session.DescribeTable()`: ```go err = db.Table().Do(ctx, diff --git a/ydb/docs/ru/core/dev/example-app/java/index.md b/ydb/docs/ru/core/dev/example-app/java/index.md index dba0966fa46..2e40e537800 100644 --- a/ydb/docs/ru/core/dev/example-app/java/index.md +++ b/ydb/docs/ru/core/dev/example-app/java/index.md @@ -49,6 +49,7 @@ this.retryCtx = SessionRetryContext.create(queryClient).build(); {% include [create_table.md](../_includes/steps/02_create_table.md) %} + Для создания таблиц используется режим транзакции `TxMode.NONE`, который позволяет выполнять схемные запросы: ```java diff --git a/ydb/docs/ru/core/dev/primary-key/row-oriented.md b/ydb/docs/ru/core/dev/primary-key/row-oriented.md index 0c23091740e..8465e37cf86 100644 --- a/ydb/docs/ru/core/dev/primary-key/row-oriented.md +++ b/ydb/docs/ru/core/dev/primary-key/row-oriented.md @@ -1,30 +1,30 @@ # Выбор первичного ключа для максимальной производительности -Выбор колонок для первичного ключа таблицы оказывает определяющее влияние на возможности YDB по масштабированию нагрузки и повышению производительности. +Выбор колонок для первичного ключа строковой таблицы оказывает определяющее влияние на возможности {{ ydb-short-name }} по масштабированию нагрузки и повышению производительности. Общие рекомендации по выбору первичного ключа: -* Следует избегать ситуаций, когда основная часть нагрузки приходится на одну [партицию](../../concepts/datamodel/table.md#partitioning) таблицы. Чем равномернее нагрузка распределяется по партициям, тем большая производительность может быть достигнута. +* Следует избегать ситуаций, когда основная часть нагрузки приходится на одну [партицию](../../concepts/datamodel/table.md#partitioning) строковой таблицы. Чем равномернее нагрузка распределяется по партициям, тем большая производительность может быть достигнута. * Следует уменьшать количество партиций, которые могут быть затронуты в одном запросе. Более того, если запрос затрагивает не более одной партиции, то он выполняется по специальному упрощенному протоколу, что существенно увеличивает скорость и экономит ресурсы. -Все таблицы в {{ ydb-short-name }} отсортированы по возрастанию первичного ключа. Это означает, что запись в таблицу данных с монотонно возрастающим первичным ключом приведет к добавлению новых данные в конец таблицы. Так как {{ ydb-short-name }} разделяет таблицы на партиции по диапазонам ключей, вставки будут обрабатываться одним конкретным сервером, отвечающим за "последнюю" партицию. Сосредоточение нагрузки на одном сервере приведет к медленной загрузке данных и неэффективному использованию распределенной системы. -В качестве примера рассмотрим запись лога пользовательских событий в таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )```. +Все строковые таблицы в {{ ydb-short-name }} отсортированы по возрастанию первичного ключа. Это означает, что запись в строковую таблицу данных с монотонно возрастающим первичным ключом приведет к добавлению новых данные в конец таблицы. Так как {{ ydb-short-name }} разделяет строковые таблицы на партиции по диапазонам ключей, вставки будут обрабатываться одним конкретным сервером, отвечающим за "последнюю" партицию. Сосредоточение нагрузки на одном сервере приведет к медленной загрузке данных и неэффективному использованию распределенной системы. +В качестве примера рассмотрим запись лога пользовательских событий в строковую таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )```. -Значения колонки ```timestamp``` монотонно возрастают; как следствие, все новые записи будут добавляться в конец таблицы, и "последняя" партиция, которая отвечает за данный диапазон ключей, будет обслуживать все операции вставки в таблицу. Это приведет к невозможности масштабирования нагрузки на вставку, производительность будет ограничена одним процессом обслуживания этой партиции, и не будет расти с добавлением серверов в кластер. +Значения колонки ```timestamp``` монотонно возрастают; как следствие, все новые записи будут добавляться в конец строковой таблицы, и "последняя" партиция, которая отвечает за данный диапазон ключей, будет обслуживать все операции вставки в таблицу. Это приведет к невозможности масштабирования нагрузки на вставку, производительность будет ограничена одним процессом обслуживания этой партиции, и не будет расти с добавлением серверов в кластер. В {{ ydb-short-name }} поддерживается автоматическое разделение партиции при достижении порогового размера или нагрузки. Но в рассматриваемом случае после разделения новая партиция начнет опять принимать всю нагрузку на вставку, и ситуация повторится. -## Приемы, позволяющие равномерно распределить нагрузку по партициям таблицы {#balance-shard-load} +## Приемы, позволяющие равномерно распределить нагрузку по партициям строковой таблицы {#balance-shard-load} ### Изменение порядка следования компонент ключа {#key-order} -Запись данных в таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )``` приводит к неравномерной нагрузке на партиции таблицы из-за монотонно возрастающего первичного ключа. Изменение порядка следования компонент ключа таким образом, чтобы монотонно возрастающая часть не была первой компонентой, может помочь более равномерно распределить нагрузку. Если изменить определение первичного ключа таблицы на ```PRIMARY KEY (userid, timestamp)```, то при достаточном количестве пользователей, генерирующих события, запись в БД будет распределена по партициям более равномерно. +Запись данных в строковую таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )``` приводит к неравномерной нагрузке на партиции таблицы из-за монотонно возрастающего первичного ключа. Изменение порядка следования компонент ключа таким образом, чтобы монотонно возрастающая часть не была первой компонентой, может помочь более равномерно распределить нагрузку. Если изменить определение первичного ключа строковой таблицы на ```PRIMARY KEY (userid, timestamp)```, то при достаточном количестве пользователей, генерирующих события, запись в БД будет распределена по партициям более равномерно. ### Использование хеша от значений ключевых колонок в качестве первичного ключа {#key-hash} -Для получения более равномерного распределения операций между партициями таблицы, а также уменьшения размеров внутренних структур данных, необходимо увеличить разнообразие значений "префикса" (начальной части) первичного ключа. Для этого можно включить в первичный ключ значение хеш-кода от всего первичного ключа или его части. +Для получения более равномерного распределения операций между партициями строковой таблицы, а также уменьшения размеров внутренних структур данных, необходимо увеличить разнообразие значений "префикса" (начальной части) первичного ключа. Для этого можно включить в первичный ключ значение хеш-кода от всего первичного ключа или его части. -Например, в рассматриваемую таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (userid, timestamp) )``` можно включить дополнительное поле, рассчитываемое как хеш-код: ```userhash = HASH(userid)```. В результате схема таблицы преобразуется к следующему виду: +Например, в рассматриваемую строковую таблицу со схемой ```( timestamp, userid, userevent, PRIMARY KEY (userid, timestamp) )``` можно включить дополнительное поле, рассчитываемое как хеш-код: ```userhash = HASH(userid)```. В результате схема таблицы преобразуется к следующему виду: ```yql ( userhash, userid, timestamp, userevent, PRIMARY KEY (userhash, userid, timestamp) ) @@ -36,7 +36,7 @@ ### Уменьшение количества партиций, затрагиваемых в одном запросе {#decrease-shards} -Предположим, что основной сценарий работы с данными таблицы — прочитать все события по конкретному ```userid```. Тогда при использовании схемы таблицы ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )``` каждое чтение будет затрагивать все партиции таблицы. При этом, каждая партиция будет просканирована полностью, так как строки, относящиеся к конкретному ```userid```, расположены в заранее неизвестном порядке. Изменение порядка следования компонент ключа ```( timestamp, userid, userevent, PRIMARY KEY (userid, timestamp) )``` приведет к тому, что все строки, относящиеся к конкретному ```userid```, будут следовать друг за другом. Такое расположение строк положительно повлияет на скорость чтения информации по конкретному ```userid```, и сократит нагрузку. +Предположим, что основной сценарий работы с данными строковой таблицы — прочитать все события по конкретному ```userid```. Тогда при использовании схемы строковой таблицы ```( timestamp, userid, userevent, PRIMARY KEY (timestamp, userid) )``` каждое чтение будет затрагивать все партиции таблицы. При этом, каждая партиция будет просканирована полностью, так как строки, относящиеся к конкретному ```userid```, расположены в заранее неизвестном порядке. Изменение порядка следования компонент ключа ```( timestamp, userid, userevent, PRIMARY KEY (userid, timestamp) )``` приведет к тому, что все строки, относящиеся к конкретному ```userid```, будут следовать друг за другом. Такое расположение строк положительно повлияет на скорость чтения информации по конкретному ```userid```, и сократит нагрузку. ## Значение NULL в ключевой колонке {#key-null} diff --git a/ydb/docs/ru/core/dev/query-plans-optimization.md b/ydb/docs/ru/core/dev/query-plans-optimization.md index 1b9924fffe7..a06dad3e986 100644 --- a/ydb/docs/ru/core/dev/query-plans-optimization.md +++ b/ydb/docs/ru/core/dev/query-plans-optimization.md @@ -10,7 +10,7 @@ SELECT season_id, episode_id WHERE title = 'The Work Outing' ``` -Схема таблицы `episodes`: +Схема строковой таблицы `episodes`:  @@ -54,9 +54,9 @@ SELECT season_id, episode_id {% endlist %} -И в визуальном и в текстовом представлении видно, что в корне этого плана возвращение данных на клиент, в листьях работа с таблицами, а на промежуточных узлах — преобразования данных. Важно обратить внимание на узел, показывающий обращение к таблице `episodes`. В данном случае это `TableFullScan`, который означает выполнение полного сканирования таблицы. А полное сканирование таблицы потребляет времени и ресурсов пропорционально её размеру, из-за чего по возможности их стараются избегать в таблицах, которые имеют тенденцию расти с течением времени или просто большие. +И в визуальном и в текстовом представлении видно, что в корне этого плана возвращение данных на клиент, в листьях работа со строковыми таблицами, а на промежуточных узлах — преобразования данных. Важно обратить внимание на узел, показывающий обращение к строковой таблице `episodes`. В данном случае это `TableFullScan`, который означает выполнение полного сканирования строковой таблицы. А полное сканирование таблицы потребляет времени и ресурсов пропорционально её размеру, из-за чего по возможности их стараются избегать в таблицах, которые имеют тенденцию расти с течением времени или просто большие. -Одним из типовых способов избежать полного сканирования таблицы является добавление [вторичного индекса](secondary-indexes.md) (поддерживается только для строковых таблиц). В данном случае имеет смысл добавить вторичный индекс для колонки `title`, для этого воспользуемся запросом: +Одним из типовых способов избежать полного сканирования строковой таблицы является добавление [вторичного индекса](secondary-indexes.md). В данном случае имеет смысл добавить вторичный индекс для колонки `title`, для этого воспользуемся запросом: ```yql ALTER TABLE episodes @@ -103,4 +103,4 @@ ALTER TABLE episodes {% endlist %} -С использованием вторичного индекса запрос выполняется без полного сканирования основной таблицы. Вместо `TableFullScan` появился `TablePointLookup` - чтение индексной таблицы по ключу, а основную таблицу мы теперь совсем не читаем, так как все нужные нам колонки содержатся в индексной таблице.
\ No newline at end of file +С использованием вторичного индекса запрос выполняется без полного сканирования основной таблицы. Вместо `TableFullScan` появился `TablePointLookup` - чтение индексной таблицы по ключу, а основную таблицу мы теперь совсем не читаем, так как все нужные нам колонки содержатся в индексной таблице. diff --git a/ydb/docs/ru/core/dev/secondary-indexes.md b/ydb/docs/ru/core/dev/secondary-indexes.md index 9097ec50ddd..d778b327579 100644 --- a/ydb/docs/ru/core/dev/secondary-indexes.md +++ b/ydb/docs/ru/core/dev/secondary-indexes.md @@ -1,10 +1,12 @@ # Вторичные индексы -[Индексы](https://ru.wikipedia.org/wiki/Индекс_(базы_данных)) — вспомогательные структуры в базах данных, позволяющие находить подходящие под определенный критерий данные без необходимости их полного перебора, а также получать отсортированные выборки без выполнения фактической сортировки, требующей обработки полного набора всех сортируемых данных. +{% include [not_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %} -Данные в таблицах {{ ydb-short-name }} всегда проиндексированы по первичному ключу. Это означает, что получение любой записи из таблицы с заданными значениями полей, составляющих первичный ключ, всегда будет занимать минимальное фиксированное время, вне зависимости от общего количества записей в таблице. Также наличие индекса по первичному ключу позволяет получить любой последовательный диапазон записей по возрастанию или убыванию первичного ключа. Время исполнения такой операции будет зависеть только от количества получаемых записей, но не зависеть от общего количества записей в таблице. +[Индексы]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Индекс_(базы_данных)){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Database_index){% endif %} — вспомогательные структуры в базах данных, позволяющие находить подходящие под определенный критерий данные без необходимости их полного перебора, а также получать отсортированные выборки без выполнения фактической сортировки, требующей обработки полного набора всех сортируемых данных. -Для того, чтобы воспользоваться аналогичными возможностями для любых полей или комбинаций полей таблицы, по ним могут быть построены дополнительные индексы, называемые **вторичными индексами**. +Данные в строковых таблицах {{ ydb-short-name }} всегда проиндексированы по первичному ключу. Это означает, что получение любой записи из строковой таблицы с заданными значениями полей, составляющих первичный ключ, всегда будет занимать минимальное фиксированное время, вне зависимости от общего количества записей в строковой таблице. Также наличие индекса по первичному ключу позволяет получить любой последовательный диапазон записей по возрастанию или убыванию первичного ключа. Время исполнения такой операции будет зависеть только от количества получаемых записей, но не зависеть от общего количества записей в строковой таблице. + +Для того, чтобы воспользоваться аналогичными возможностями для любых полей или комбинаций полей строковой таблицы, по ним могут быть построены дополнительные индексы, называемые **вторичными индексами**. В транзакционных системах использование индексов позволяет сократить или исключить деградацию производительности и повышение стоимости выполнения запросов при росте объема хранимых данных. @@ -16,7 +18,7 @@ Команда [создания индекса `table index add`](../reference/ydb-cli/commands/secondary_index.md#add) поддерживается в {{ ydb-short-name }} CLI. -Так как индекс содержит собственные данные, являющиеся производными от данных в таблице, то при создании индекса на существующей таблице с данными будет выполнена операция начального построения индекса, которая может занимать продолжительное время. Данная операция выполняется в фоновом режиме, не блокирует работу с таблицей, но до окончания построения новым индексом воспользоваться будет невозможно. +Так как индекс содержит собственные данные, являющиеся производными от данных в строковой таблице, то при создании индекса на существующей таблице с данными будет выполнена операция начального построения индекса, которая может занимать продолжительное время. Данная операция выполняется в фоновом режиме, не блокирует работу с таблицей, но до окончания построения новым индексом воспользоваться будет невозможно. Использование индекса возможно только в порядке включенных в него полей. Если в индексе два поля `a` и `b`, то такой индекс может быть эффективно использован для запросов вида: @@ -35,7 +37,7 @@ ## Применение вторичных индексов при выборке данных {#use} -Для обращения к таблице по вторичному индексу его имя должно быть явно указано в секции `VIEW` после имени таблицы, как описано в статье про [команду `SELECT`](../yql/reference/syntax/select#secondary_index) YQL. Например, для получения из таблицы Заказов (`orders`) выборки заказов клиента с заданным ID (`id_customer`) запрос будет выглядеть следующим образом: +Для обращения к строковой таблице по вторичному индексу его имя должно быть явно указано в секции `VIEW` после имени таблицы, как описано в статье про [команду `SELECT`](../yql/reference/syntax/select#secondary_index) YQL. Например, для получения из строковой таблицы Заказов (`orders`) выборки заказов клиента с заданным ID (`id_customer`) запрос будет выглядеть следующим образом: ```yql DECLARE $customer_id AS Uint64; @@ -44,9 +46,9 @@ FROM orders VIEW idx_customer AS o WHERE o.id_customer = $customer_id ``` -, где `idx_customer` — имя вторичного индекса на таблице `orders`, первым в котором указано поле `id_customer`. +, где `idx_customer` — имя вторичного индекса на строковой таблице `orders`, первым в котором указано поле `id_customer`. -Без указания секции `VIEW` для выполнения такого запроса будет полностью просканирована таблица `orders`. +Без указания секции `VIEW` для выполнения такого запроса будет полностью просканирована строковая таблица `orders`. В транзакционных приложениях подобные информационные запросы выполняются с использованием поcтраничного вывода данных, что исключает рост стоимости и времени исполнения при увеличении количества записей, подходящих под условия фильтрации. Описанный на примере первичного ключа подход к написанию [постраничных запросов](../dev/paging.md) применим также и к колонкам, включенным во вторичный индекс. @@ -137,9 +139,9 @@ CREATE TABLE `Table` ( ## Обновление данных с использованием вторичного индекса {#update} -Команды YQL изменения записей ([`UPDATE`](../yql/reference/syntax/update.md), [`UPSERT`](../yql/reference/syntax/upsert_into.md), [`REPLACE`](../yql/reference/syntax/replace_into.md)) не позволяют указать на использование вторичного индекса для поиска данных, поэтому попытка выполнить `UPDATE ... WHERE indexed_field = $value` приведет к полному сканированию таблицы. Чтобы избежать этого, можно предварительно выполнить `SELECT` по индексу с получением значения первичного ключа, а затем выполнить `UPDATE` по первичному ключу. Также можно воспользоваться инструкцией `UPDATE ON`. +Команды YQL изменения записей ([`UPDATE`](../yql/reference/syntax/update.md), [`UPSERT`](../yql/reference/syntax/upsert_into.md), [`REPLACE`](../yql/reference/syntax/replace_into.md)) не позволяют указать на использование вторичного индекса для поиска данных, поэтому попытка выполнить `UPDATE ... WHERE indexed_field = $value` приведет к полному сканированию строковой таблицы. Чтобы избежать этого, можно предварительно выполнить `SELECT` по индексу с получением значения первичного ключа, а затем выполнить `UPDATE` по первичному ключу. Также можно воспользоваться инструкцией `UPDATE ON`. -Чтобы обновить данные в таблице `table1`, выполните запрос: +Чтобы обновить данные в строковой таблице `table1`, выполните запрос: ```yql $to_update = ( @@ -160,7 +162,7 @@ UPDATE table1 ON SELECT * FROM $to_update Для удаления данных по вторичному индексу используется `SELECT` c предикатом по вторичному индексу, а затем вызывается инструкция `DELETE ON`. -Чтобы удалить все данные о сериалах с нулевым количеством просмотров в таблице `series`, выполните запрос: +Чтобы удалить все данные о сериалах с нулевым количеством просмотров в строковой таблице `series`, выполните запрос: ```yql DELETE FROM series ON @@ -181,10 +183,10 @@ WHERE views = 0; Атомарно заменить существующий индекс можно с помощью команды {{ ydb-short-name }} CLI [{{ ydb-cli }} table index rename](../reference/ydb-cli/commands/secondary_index.md#rename) с параметром `--replace`. -## Производительность записи в таблицы со вторичными индексами {#write_performance} +## Производительность записи в строковой таблицы со вторичными индексами {#write_performance} -Для работы вторичных индексов необходимы дополнительные структуры данных. Поддержка этих структур приводит к повышению стоимости операций изменения данных в таблицах. +Для работы вторичных индексов необходимы дополнительные структуры данных. Поддержка этих структур приводит к повышению стоимости операций изменения данных в строковых таблицах. -При синхронном обновлении индексов транзакция подтверждается только после записи всех необходимых данных, как в таблице, так и в синхронных индексах. Это приводит как к увеличению времени исполнения, так и к необходимости применения [распределенных транзакций](../concepts/transactions#distributed-tx) даже при добавлении или изменении записей в единственной партиции. +При синхронном обновлении индексов транзакция подтверждается только после записи всех необходимых данных, как в строковой таблице, так и в синхронных индексах. Это приводит как к увеличению времени исполнения, так и к необходимости применения [распределенных транзакций](../concepts/transactions#distributed-tx) даже при добавлении или изменении записей в единственной партиции. Асинхронно обновляемые индексы сохраняют возможность применения одношардовых транзакций, однако гарантируют только консистентность "в конечном счете", и все равно создают нагрузку на базу данных. diff --git a/ydb/docs/ru/core/dev/terraform.md b/ydb/docs/ru/core/dev/terraform.md index 9e843eaf6f5..588c5a6405f 100644 --- a/ydb/docs/ru/core/dev/terraform.md +++ b/ydb/docs/ru/core/dev/terraform.md @@ -2,9 +2,9 @@ С помощью [Terraform](https://www.terraform.io/) можно создавать, удалять и изменять следующие объекты внутри кластера {{ ydb-short-name }}: -* [таблицы](../concepts/datamodel/table.md); -* [индексы](../concepts/secondary_indexes.md) таблиц; -* [потоки изменений](../concepts/cdc.md) таблиц; +* [строковые](../concepts/datamodel/table.md#row-oriented-tables) таблицы; +* [вторичные индексы](../concepts/secondary_indexes.md) для строковых таблиц; +* [потоки изменений](../concepts/cdc.md) строковых таблиц; * [топики](../concepts/topic.md). {% note warning %} @@ -84,7 +84,7 @@ * Строка соединения `connection_string` — выражение вида `grpc(s)://HOST:PORT/?database=/database/path`, где `grpc(s)://HOST:PORT/` эндпоинт, а `/database/path` — путь БД. Например, `grpcs://example.com:2135?database=/Root/testdb0`. -* `database_endpoint` - используется при работе с ресурсом [топиков](#topic_resource) (аналог `connection_string` при работе с ресурсами таблиц). +* `database_endpoint` - используется при работе с ресурсом [топиков](#topic_resource) (аналог `connection_string` при работе с ресурсами строковых таблиц). {% note info %} @@ -149,7 +149,7 @@ resource "ydb_table_index" "table_index" { type = "global_sync" # "global_async" columns = ["a", "b"] - depends_on = [ydb_table.table] # ссылка на ресурс создания таблицы + depends_on = [ydb_table.table] # ссылка на ресурс создания строковой таблицы } resource "ydb_table_changefeed" "table_changefeed" { @@ -162,7 +162,7 @@ resource "ydb_table_changefeed" "table_changefeed" { supported_codecs = ["raw", "gzip"] } - depends_on = [ydb_table.table] # ссылка на ресурс создания таблицы + depends_on = [ydb_table.table] # ссылка на ресурс создания строковой таблицы } resource "ydb_topic" "test" { @@ -194,13 +194,9 @@ resource "ydb_topic" "test" { ### Строковая таблица {#ydb-table} -{% note info %} - -Работа с колоночными таблицами через Terraform пока не доступна. +{% include [not_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %} -{% endnote %} - -Для работы с таблицами используется ресурс `ydb_table`. +Для работы со строковыми таблицами используется ресурс `ydb_table`. Пример: @@ -241,7 +237,7 @@ resource "ydb_topic" "test" { Поддерживаются следующие аргументы: -* `path` — (обязательный) путь таблицы, относительно корня базы (пример - `/path/to/table`). +* `path` — (обязательный) путь строковой таблицы, относительно корня базы (пример - `/path/to/table`). * `connection_string` — (обязательный) [строка соединения](#connection_string). * `column` — (обязательный) свойства колонки (см. аргумент [column](#column)). * `family` — (необязательный) группа колонок (см. аргумент [family](#family)). @@ -257,7 +253,7 @@ resource "ydb_topic" "test" { {% note warning %} -При помощи Terraform нельзя удалить колонку, можно только добавить. Чтобы удалить колонку, используйте средства {{ ydb-short-name }}, затем удалите колонку из описания ресурса. При попытке "прокатки" изменений колонок таблицы (смена типа, имени), Terraform не попытается их удалить, а попытается сделать update-in-place, но изменения применены не будут. +При помощи Terraform нельзя удалить колонку, можно только добавить. Чтобы удалить колонку, используйте средства {{ ydb-short-name }}, затем удалите колонку из описания ресурса. При попытке "прокатки" изменений колонок строковой таблицы (смена типа, имени), Terraform не попытается их удалить, а попытается сделать update-in-place, но изменения применены не будут. {% endnote %} @@ -273,7 +269,7 @@ column { ``` * `name` — (обязательный) имя колонки. -* `type` — (обязательный) [тип данных YQL](../yql/reference/types/primitive.html) колонки. Допускается использовать простые типы колонок. Как пример, контейнерные типы не могут быть использованы в качестве типов данных колонок таблиц. +* `type` — (обязательный) [тип данных YQL](../yql/reference/types/primitive.md) колонки. Допускается использовать простые типы колонок. Как пример, контейнерные типы не могут быть использованы в качестве типов данных колонок строковых таблиц. * `family` — (необязательный) имя группы колонок (см. аргумент [family](#family)). * `not_null` — (необязательный) колонка не может содержать `NULL`. Значение по умолчанию: `false`. @@ -342,9 +338,9 @@ ttl { * `microseconds` * `nanoseconds` -### Вторичный индекс таблицы {#ydb-table-index} +### Вторичный индекс строковой таблицы {#ydb-table-index} -Для работы с индексом таблицы используется ресурс [ydb_table_index](../concepts/secondary_indexes.md). +Для работы с индексом строковой таблицы используется ресурс [ydb_table_index](../concepts/secondary_indexes.md). Пример: @@ -361,18 +357,20 @@ resource "ydb_table_index" "ydb_table_index" { Поддерживаются следующие аргументы: -* `table_path` — путь таблицы. Указывается, если не задан `table_id`. +* `table_path` — путь строковой таблицы. Указывается, если не задан `table_id`. * `connection_string` — [строка соединения](#connection_string). Указывается, если не задан `table_id`. -* `table_id` - terraform-идентификатор таблицы. Указывается, если не задан `table_path` или `connection_string`. +* `table_id` - terraform-идентификатор строковой таблицы. Указывается, если не задан `table_path` или `connection_string`. * `name` — (обязательный) имя индекса. * `type` — (обязательный) тип индекса [global_sync | global_async](../yql/reference/syntax/create_table/secondary_index.md). * `columns` — (обязательный) упорядоченный список имён колонок, участвующий в индексе. * `cover` — (обязательный) список дополнительных колонок для покрывающего индекса. -### Поток изменений таблицы {#ydb-table-changefeed} +### Поток изменений строковой таблицы {#ydb-table-changefeed} + +{% include [not_allow_for_olap](../_includes/not_allow_for_olap_note_main.md) %} -Для работы с [потоком изменений](../concepts/cdc.md) таблицы используется ресурс `ydb_table_changefeed`. +Для работы с [потоком изменений](../concepts/cdc.md) строковой таблицы используется ресурс `ydb_table_changefeed`. Пример: @@ -387,9 +385,9 @@ resource "ydb_table_changefeed" "ydb_table_changefeed" { Поддерживаются следующие аргументы: -* `table_path` — путь таблицы. Указывается, если не задан `table_id`. +* `table_path` — путь строковой таблицы. Указывается, если не задан `table_id`. * `connection_string` — [строка соединения](#connection_string). Указывается, если не задан `table_id`. -* `table_id` — terraform-идентификатор таблицы. Указывается, если не задан `table_path` или `connection_string`. +* `table_id` — terraform-идентификатор строковой таблицы. Указывается, если не задан `table_path` или `connection_string`. * `name` — (обязательный) имя потока изменений. * `mode` — (обязательный) режим работы [потока изменений](../yql/reference/syntax/alter_table#changefeed-options). @@ -408,11 +406,11 @@ resource "ydb_table_changefeed" "ydb_table_changefeed" { ### Примеры использования {manage-examples} -#### Создание таблицы в существующей БД {#example-with-connection-string} +#### Создание строковой таблицы в существующей БД {#example-with-connection-string} ```tf resource "ydb_table" "ydb_table" { - # Путь до таблицы + # Путь до строковой таблицы path = "path/to/table" # путь относительно корня базы connection_string = "grpc(s)://HOST:PORT/?database=/database/path" #пример подключения к БД @@ -451,11 +449,11 @@ resource "ydb_table" "ydb_table" { } ``` -#### Создание таблицы, индекса и потока изменений {#example-with-table} +#### Создание строковой таблицы, индекса и потока изменений {#example-with-table} ```tf resource "ydb_table" "ydb_table" { - # Путь до таблицы + # Путь до строковой таблицы path = "path/to/table" # путь относительно корня базы # ConnectionString до базы данных. @@ -521,7 +519,7 @@ resource "ydb_table_changefeed" "ydb_table_changefeed" { name = "test_consumer" } - depends_on = [ydb_table.ydb_table] # ссылка на ресурс создания таблицы + depends_on = [ydb_table.ydb_table] # ссылка на ресурс создания строковой таблицы } resource "ydb_table_index" "ydb_table_index" { @@ -531,7 +529,7 @@ resource "ydb_table_index" "ydb_table_index" { cover = ["e"] type = "global_sync" - depends_on = [ydb_table.ydb_table] # ссылка на ресурс создания таблицы + depends_on = [ydb_table.ydb_table] # ссылка на ресурс создания строковой таблицы } ``` @@ -578,7 +576,7 @@ resource "ydb_topic" "ydb_topic" { Поддерживаются следующие аргументы: * `name` - (обязательный) имя топика. -* `database_endpoint` - (обязательный) полный путь до базы данных, например: `"grpcs://example.com:2135/?database=/Root/testdb0"`; аналог `connection_string` для таблиц. +* `database_endpoint` - (обязательный) полный путь до базы данных, например: `"grpcs://example.com:2135/?database=/Root/testdb0"`; аналог `connection_string` для строковых таблиц. * `retention_period_ms` - длительность хранения данных в миллисекундах, значение по умолчанию - `86400000` (сутки). * `partitions_count` - количество партиций, значение по умолчанию - `2`. * `supported_codecs` - поддерживаемые кодеки сжатия данных, значение по умолчанию - `"gzip", "raw", "zstd"`. diff --git a/ydb/docs/ru/core/dev/yql-tutorial/alter_table.md b/ydb/docs/ru/core/dev/yql-tutorial/alter_table.md index 5d1f1e942c8..c0d754e02d1 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/alter_table.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/alter_table.md @@ -1,12 +1,12 @@ # Добавление и удаление колонок -Добавьте новую колонку в таблицу, а затем удалите ее. +Добавьте новую колонку в строковую или колоночную таблицу, а затем удалите ее. {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} ## Добавить колонку {#add-column} -Добавьте неключевую колонку в существующую таблицу: +Добавьте неключевую колонку в существующую строковую или колоночную таблицу: ```yql ALTER TABLE episodes ADD COLUMN viewers Uint64; @@ -14,7 +14,7 @@ ALTER TABLE episodes ADD COLUMN viewers Uint64; ## Удалить колонку {#delete-column} -Удалите добавленную колонку из таблицы: +Удалите добавленную колонку из строковой или колоночной таблицы: ```yql ALTER TABLE episodes DROP COLUMN viewers; diff --git a/ydb/docs/ru/core/dev/yql-tutorial/basic_aggregation.md b/ydb/docs/ru/core/dev/yql-tutorial/basic_aggregation.md index 6213e8f4a3f..263b714240c 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/basic_aggregation.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/basic_aggregation.md @@ -27,6 +27,4 @@ ORDER BY series_id, season_id ; - -COMMIT; ```
\ No newline at end of file diff --git a/ydb/docs/ru/core/dev/yql-tutorial/basic_filter_and_sort.md b/ydb/docs/ru/core/dev/yql-tutorial/basic_filter_and_sort.md index 2b774e75912..03226416c1f 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/basic_filter_and_sort.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/basic_filter_and_sort.md @@ -25,6 +25,4 @@ ORDER BY -- Сортировка результатов. LIMIT 3 -- LIMIT N после ORDER BY означает -- «получить первые N» или «последние N» результатов ; -- в зависимости от порядка сортировки. - -COMMIT; ```
\ No newline at end of file diff --git a/ydb/docs/ru/core/dev/yql-tutorial/conditional_values.md b/ydb/docs/ru/core/dev/yql-tutorial/conditional_values.md index 5c824386345..a7e51d3c5de 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/conditional_values.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/conditional_values.md @@ -49,6 +49,4 @@ GROUP BY -- Результат будет доступен в SELECT -- через алиас, указанный с помощью AS. ; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/create_demo_tables.md b/ydb/docs/ru/core/dev/yql-tutorial/create_demo_tables.md index 08468391e95..43b173ea010 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/create_demo_tables.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/create_demo_tables.md @@ -1,6 +1,6 @@ -# Создание таблицы +# Создание таблиц -Создайте таблицы и задайте для них схемы данных с помощью конструкции [CREATE TABLE](../../yql/reference/syntax/create_table/index.md). +Создайте строковые таблицы для OLTP-операций или колоночные таблицы для OLAP-нагрузок и задайте для них схемы данных с помощью конструкции [CREATE TABLE](../../yql/reference/syntax/create_table/index.md). Подробнее о типах таблиц в {{ ydb-short-name }} и области их применения можно прочесть в статье [{#T}](../../concepts/datamodel/table.md) {% note info %} @@ -8,40 +8,95 @@ {% endnote %} -```yql -CREATE TABLE series -- series — имя таблицы. -( -- Должно быть уникальным в пределах каталога. - series_id Uint64, - title Utf8, - series_info Utf8, - release_date Uint64, - PRIMARY KEY (series_id) -- Первичный ключ — это столбец или - -- комбинация столбцов, однозначно идентифицирующих - -- каждую строку в таблице (может содержать только - -- неповторяющиеся значения). Для таблицы может быть - -- указан только один первичный ключ. Для каждой таблицы - -- YDB указание первичного ключа является обязательным. -); - -CREATE TABLE seasons -( - series_id Uint64, - season_id Uint64, - title Utf8, - first_aired Uint64, - last_aired Uint64, - PRIMARY KEY (series_id, season_id) -); - -CREATE TABLE episodes -( - series_id Uint64, - season_id Uint64, - episode_id Uint64, - title Utf8, - air_date Uint64, - PRIMARY KEY (series_id, season_id, episode_id) -); - -COMMIT; -``` +{% list tabs %} + +- Создание строковых таблиц + + ```sql + CREATE TABLE series -- series — имя таблицы. + ( -- Должно быть уникальным в пределах каталога. + series_id Uint64, + title Utf8, + series_info Utf8, + release_date Uint64, + PRIMARY KEY (series_id) -- Первичный ключ — это столбец или + -- комбинация столбцов, однозначно идентифицирующих + -- каждую строку в таблице (может содержать только + -- неповторяющиеся значения). Для таблицы может быть + -- указан только один первичный ключ. Для каждой таблицы + -- YDB указание первичного ключа является обязательным. + ); + + CREATE TABLE seasons + ( + series_id Uint64, + season_id Uint64, + title Utf8, + first_aired Uint64, + last_aired Uint64, + PRIMARY KEY (series_id, season_id) + ); + + CREATE TABLE episodes + ( + series_id Uint64, + season_id Uint64, + episode_id Uint64, + title Utf8, + air_date Uint64, + PRIMARY KEY (series_id, season_id, episode_id) + ); + ``` + +- Создание колоночных таблиц + + Колоночная таблица в YQL создаётся путём указания в конструкции `CREATE TABLE` блока `WITH` с параметром `STORE = COLUMN`. + + ```sql + CREATE TABLE series -- series — имя таблицы. + ( -- Должно быть уникальным в пределах каталога. + series_id Uint64 NOT NULL, -- первичный ключ колоночной таблицы не может быть NULLABLE + title Utf8, + series_info Utf8, + release_date Uint64, + PRIMARY KEY (series_id) -- Первичный ключ — это столбец или + -- комбинация столбцов, однозначно идентифицирующих + -- каждую строку в таблице (может содержать только + -- неповторяющиеся значения). Для таблицы может быть + -- указан только один первичный ключ. Для каждой таблицы + -- YDB указание первичного ключа является обязательным. + ) + PARTITION BY HASH(series_id) -- Партиционирование таблицы по хешу от набора колонок + WITH ( + STORE = COLUMN -- STORE указывает на тип таблицы + -- если указан COLUMN, то будет создана колоночная таблица + ); + + CREATE TABLE seasons + ( + series_id Uint64 NOT NULL, + season_id Uint64 NOT NULL, + title Utf8, + first_aired Uint64, + last_aired Uint64, + PRIMARY KEY (series_id, season_id) + ) + WITH ( + STORE = COLUMN + ); + + CREATE TABLE episodes + ( + series_id Uint64 NOT NULL, + season_id Uint64 NOT NULL, + episode_id Uint64 NOT NULL, + title Utf8, + air_date Uint64, + PRIMARY KEY (series_id, season_id, episode_id) + ) + WITH ( + STORE = COLUMN + ); + ``` + +{% endlist %} diff --git a/ydb/docs/ru/core/dev/yql-tutorial/delete.md b/ydb/docs/ru/core/dev/yql-tutorial/delete.md index d5528c847d3..49b9582d2c7 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/delete.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/delete.md @@ -1,6 +1,14 @@ # Удаление данных -Удалите данные из таблицы с помощью оператора [DELETE](../../yql/reference/syntax/delete.md). +{% note warning %} + +{% include [OLAP_not_allow_text](../../_includes/not_allow_for_olap_text.md) %} + +Вместо `DELETE FROM` для удаления данных из колоночных таблиц можно воспользоваться механизмом удаления строк по времени — [TTL](../../concepts/ttl.md). TTL можно задать при [создании](../../yql/reference/syntax/create_table/index.md) строковой или колоночной таблицы (`CREATE TABLE`) или при их [изменении](../../yql/reference/syntax/alter_table/index.md) (`ALTER TABLE`). + +{% endnote %} + +Удалите данные из строковой таблицы с помощью оператора [DELETE](../../yql/reference/syntax/delete.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -13,8 +21,6 @@ WHERE AND episode_id = 12 ; -COMMIT; - -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 2 AND season_id = 5; @@ -35,10 +41,6 @@ SELECT * FROM episodes WHERE series_id = 1 AND season_id = 1; DELETE FROM episodes ON SELECT * FROM $to_delete; -COMMIT; - -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 1 AND season_id = 1; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/delete_table.md b/ydb/docs/ru/core/dev/yql-tutorial/delete_table.md index 35af457f4b9..9ffaf384e69 100644 --- a/ydb/docs/ru/core/dev/yql-tutorial/delete_table.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/delete_table.md @@ -1,6 +1,6 @@ -# Удаление таблицы +# Удаление таблиц -Удалите [созданные](create_demo_tables.md) таблицы с помощью конструкции [DROP TABLE](../../yql/reference/syntax/drop_table.md). +Удалите [созданные](create_demo_tables.md) строковые и/или колоночные таблицы с помощью конструкции [DROP TABLE](../../yql/reference/syntax/drop_table.md). ```yql DROP TABLE episodes; diff --git a/ydb/docs/ru/core/dev/yql-tutorial/fill_tables_with_data.md b/ydb/docs/ru/core/dev/yql-tutorial/fill_tables_with_data.md index f3e50c4f929..fbbca78bb9c 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/fill_tables_with_data.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/fill_tables_with_data.md @@ -1,6 +1,14 @@ -# Добавление данных в таблицу +# Добавление данных в таблицы -Наполните данными [созданные](create_demo_tables.md) таблицы с помощью конструкции [REPLACE INTO](../../yql/reference/syntax/replace_into.md). +{% note warning %} + +{% include [not_allow_for_olap](../../_includes/not_allow_for_olap_text.md) %} + +{% include [not_allow_for_olap](../../_includes/ways_add_data_to_olap.md) %} + +{% endnote %} + +Наполните данными [созданные](create_demo_tables.md) ранее строковые таблицы с помощью конструкции [REPLACE INTO](../../yql/reference/syntax/replace_into.md). ```yql REPLACE INTO series (series_id, title, release_date, series_info) @@ -113,6 +121,4 @@ VALUES (2, 5, 6, "Artificial Emotional Intelligence", CAST(Date("2018-04-29") AS Uint64)), (2, 5, 7, "Initial Coin Offering", CAST(Date("2018-05-06") AS Uint64)), (2, 5, 8, "Fifty-One Percent", CAST(Date("2018-05-13") AS Uint64)); - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/insert_into.md b/ydb/docs/ru/core/dev/yql-tutorial/insert_into.md index fabb4d6d983..bbd478df3fb 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/insert_into.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/insert_into.md @@ -1,6 +1,14 @@ # Вставка данных с помощью INSERT -Добавьте данные в таблицу с помощью конструкции [INSERT INTO](../../yql/reference/syntax/insert_into.md). +{% note warning %} + +{% include [not_allow_for_olap](../../_includes/not_allow_for_olap_text.md) %} + +{% include [not_allow_for_olap](../../_includes/ways_add_data_to_olap.md) %} + +{% endnote %} + +Добавьте данные в строковую таблицу с помощью конструкции [INSERT INTO](../../yql/reference/syntax/insert_into.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -34,6 +42,4 @@ COMMIT; -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 2 AND season_id = 5; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md b/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md index 22dbbbd3be1..8db90c778dd 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md @@ -22,6 +22,4 @@ ORDER BY -- Cортировка результатов. sa.season_id -- ORDER BY сортирует значения по одному ; -- или нескольким столбцам. -- Столбцы перечисляются через запятую. - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/replace_into.md b/ydb/docs/ru/core/dev/yql-tutorial/replace_into.md index 4faa690af1a..cb635ac293c 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/replace_into.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/replace_into.md @@ -1,6 +1,14 @@ # Вставка и модификация данных с помощью REPLACE -Добавьте данные в таблицу с помощью конструкции [REPLACE INTO](../../yql/reference/syntax/replace_into.md). +{% note warning %} + +{% include [not_allow_for_olap](../../_includes/not_allow_for_olap_text.md) %} + +{% include [not_allow_for_olap](../../_includes/ways_add_data_to_olap.md) %} + +{% endnote %} + +Добавьте данные в строковые таблицы с помощью конструкции [REPLACE INTO](../../yql/reference/syntax/replace_into.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -29,6 +37,4 @@ COMMIT; -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 2 AND season_id = 5; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/select_all_columns.md b/ydb/docs/ru/core/dev/yql-tutorial/select_all_columns.md index 2ebfe893132..a7f6399c278 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/select_all_columns.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/select_all_columns.md @@ -1,6 +1,6 @@ # Выборка данных из всех колонок -Выберите все колонки из таблицы с помощью оператора [SELECT](../../yql/reference/syntax/select/index.md). +Выберите все колонки из таблиц с помощью оператора [SELECT](../../yql/reference/syntax/select/index.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -9,7 +9,6 @@ SELECT -- Оператор выбора данных. * -- Выбор всех колонок из таблицы. -FROM episodes; -- Таблица, из которой нужно выбрать данные. - -COMMIT; +FROM `<table_name>`; -- Таблица, из которой нужно выбрать данные. + -- Можно выбрать данные из таблиц: series, seasons, episodes. ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/select_specific_columns.md b/ydb/docs/ru/core/dev/yql-tutorial/select_specific_columns.md index 8b4a789838a..c48f7025632 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/select_specific_columns.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/select_specific_columns.md @@ -15,7 +15,5 @@ SELECT CAST(release_date AS Date) AS release_date FROM series; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/update.md b/ydb/docs/ru/core/dev/yql-tutorial/update.md index ae003eed576..a95a7d95ebb 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/update.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/update.md @@ -1,6 +1,14 @@ # Обновление данных с помощью UPDATE -Обновите данные в таблице с помощью оператора [UPDATE](../../yql/reference/syntax/update.md). +{% note warning %} + +{% include [not_allow_for_olap](../../_includes/not_allow_for_olap_text.md) %} + +{% include [not_allow_for_olap](../../_includes/ways_add_data_to_olap.md) %} + +{% endnote %} + +Обновите данные в строковой таблице с помощью оператора [UPDATE](../../yql/reference/syntax/update.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -42,6 +50,4 @@ COMMIT; -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 1 AND season_id = 1; - -COMMIT; ``` diff --git a/ydb/docs/ru/core/dev/yql-tutorial/upsert_into.md b/ydb/docs/ru/core/dev/yql-tutorial/upsert_into.md index 709ba71e1e4..b35c86a7721 100755 --- a/ydb/docs/ru/core/dev/yql-tutorial/upsert_into.md +++ b/ydb/docs/ru/core/dev/yql-tutorial/upsert_into.md @@ -1,6 +1,14 @@ # Вставка и модификация данных с помощью UPSERT -Добавьте данные в таблицу с помощью конструкции [UPSERT INTO](../../yql/reference/syntax/upsert_into.md). +{% note warning %} + +{% include [not_allow_for_olap](../../_includes/not_allow_for_olap_text.md) %} + +{% include [not_allow_for_olap](../../_includes/ways_add_data_to_olap.md) %} + +{% endnote %} + +Добавьте данные в строковою таблицу с помощью конструкции [UPSERT INTO](../../yql/reference/syntax/upsert_into.md). {% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %} @@ -27,6 +35,4 @@ COMMIT; -- Посмотреть результат: SELECT * FROM episodes WHERE series_id = 2 AND season_id = 5; - -COMMIT; ``` |