aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpnv1 <pnv1@yandex-team.ru>2022-03-24 16:01:17 +0300
committerpnv1 <pnv1@yandex-team.ru>2022-03-24 16:01:17 +0300
commitfc131012dada714b26d872d3532bde52e4aba2b1 (patch)
tree6f037b80647a7ddc63ab3e407bba2c7751d8bb72
parent04156efbfd06d47a7b749159b1a00a756fa5c41b (diff)
downloadydb-fc131012dada714b26d872d3532bde52e4aba2b1.tar.gz
Add some optimisations to FAQ section, KIKIMR-14347
ref:5027a4927001215999e4493ef99de22ed6761175
-rw-r--r--ydb/docs/ru/core/faq/_includes/all.md8
-rw-r--r--ydb/docs/ru/core/faq/_includes/common.md4
-rw-r--r--ydb/docs/ru/core/faq/_includes/errors.md22
-rw-r--r--ydb/docs/ru/core/faq/_includes/index.md3
-rw-r--r--ydb/docs/ru/core/faq/_includes/sdk.md6
-rw-r--r--ydb/docs/ru/core/faq/_includes/yql.md16
-rw-r--r--ydb/docs/ru/core/faq/all.md4
7 files changed, 32 insertions, 31 deletions
diff --git a/ydb/docs/ru/core/faq/_includes/all.md b/ydb/docs/ru/core/faq/_includes/all.md
index ffda31a64a..7e307b34d5 100644
--- a/ydb/docs/ru/core/faq/_includes/all.md
+++ b/ydb/docs/ru/core/faq/_includes/all.md
@@ -12,10 +12,14 @@
{% endif %}
+## Ошибки {#errors}
+
+{% include notitle [errors.md](../errors.md) %}
+
## YQL {#yql}
{% include notitle [yql.md](../yql.md) %}
-## Ошибки {#errors}
+## Serverless {#serverless}
-{% include notitle [errors.md](../errors.md) %}
+{% include notitle [serverless.md](../serverless.md) %}
diff --git a/ydb/docs/ru/core/faq/_includes/common.md b/ydb/docs/ru/core/faq/_includes/common.md
index f73f1080f9..e8a30ee739 100644
--- a/ydb/docs/ru/core/faq/_includes/common.md
+++ b/ydb/docs/ru/core/faq/_includes/common.md
@@ -23,7 +23,7 @@ description: "Что такое YDB? Для каких задач стоит и
Чтобы правильно спроектировать первичный ключ, стоит придерживаться следующих правил:
-* Необходимо избегать ситуаций, когда основная часть нагрузки приходится на одну партицию таблицы. При равномерной нагрузке проще достигается высокая общая производительность.
+* Необходимо избегать ситуаций, когда основная часть нагрузки приходится на одну [партицию](../../concepts/datamodel.md#partitioning) таблицы. При равномерной нагрузке проще достигается высокая общая производительность.
Как следствие этого правила, не стоит в качестве первичного ключа таблицы использовать монотонно возрастающую последовательность, например, timestamp.
* Чем меньше партиций таблиц будет задействовано во время исполнения запроса, тем быстрее он будет исполнен. Чтобы достичь большей производительности стоит руководствоваться правилом: один запрос — одна партиция.
@@ -58,7 +58,7 @@ description: "Что такое YDB? Для каких задач стоит и
Вторичные индексы в {{ ydb-short-name }} — глобальные и могут быть неуникальными.
-Подробнее читайте в [документации](../../concepts/secondary_indexes.md).
+Подробнее читайте в разделе [Вторичные индексы](../../concepts/secondary_indexes.md).
#### Как осуществляется постраничный вывод? {#paging}
diff --git a/ydb/docs/ru/core/faq/_includes/errors.md b/ydb/docs/ru/core/faq/_includes/errors.md
index aa61d11d95..37b87b30b4 100644
--- a/ydb/docs/ru/core/faq/_includes/errors.md
+++ b/ydb/docs/ru/core/faq/_includes/errors.md
@@ -1,5 +1,11 @@
# Ошибки
+#### Почему может возникать ошибка «Status: OVERLOADED Error: Pending previous query completion» в C++ SDK?
+
+Q: При запуске двух запросов, пытаюсь получить ответ из фьючера от второго из них. Получаю: `Status: OVERLOADED Why: <main>: Error: Pending previous query completion`.
+
+A: Сессия в SDK однопоточная. Если нужно параллельно использовать несколько запросов, нужно создавать несколько сессий.
+
#### Что делать, если я часто получаю ошибку «Transaction locks invalidated»? {#locks-invalidated}
Обычно при получении этой ошибки следует повторить выполнение транзакции, так как {{ ydb-short-name }} использует оптимистичные блокировки. Если такая ошибка возникает часто, это означает, что в транзакции читается большое количество строк или, что много транзакций конкурируют за одни и те же «горячие» строки. Имеет смысл просмотреть запросы, выполняющиеся в транзакции и определить, не читают ли они лишние строки.
@@ -9,3 +15,19 @@
В логике на клиентской стороне надо стараться держать как можно более короткие транзакции.
В рамках сессии разрешено не более 10 активных транзакций. При старте транзакции нужно использовать либо коммит-флаг для автокоммита, либо явный коммит/роллбек.
+
+#### Что делать, если при запросе я получаю ошибку «Datashard: Reply size limit exceeded»? {#reply-size-exceeded}
+
+Данная ошибка означает, что при выполнении запроса с одного из участвующих в нем даташардов была попытка вернуть более 50 МБ данных, что превышает допустимый лимит.
+
+Рекомендации:
+
+* Общая рекомендация — уменьшить объем данных, обрабатываемых в транзакции.
+* Если выполняется операция `Join`, стоит убедиться, что она выполняется способом [Index lookup Join](../yql.md#index-lookup-join).
+* Если осуществляется простая выборка, стоит убедиться, что она делается по ключам, или добавить `LIMIT` в запрос.
+
+#### Что делать, если при запросе я получаю ошибку «Datashard program size limit exceeded»? {#program-size-exceeded}
+
+Данная ошибка означает, что размер программы (в сумме со значениями параметров) для одного из даташардов превысил лимит в 50 МБ. Чаще всего это означает попытку записать в таблицы базы более 50 МБ данных в одной транзакции. В качестве записей учитываются все модифицирующие операции в транзакции, такие как `UPSERT`, `REPLACE`, `INSERT`, `UPDATE`.
+
+Необходимо уменьшить суммарных объем записей в одной транзакции. В общем случае не рекомендуется объединять в единую транзакцию запросы, которые логически не требуют транзакционности. В случае добавления/обновления данных батчами, рекомендуется уменьшить размер одного батча до значений, не превышающих нескольких мегабайт.
diff --git a/ydb/docs/ru/core/faq/_includes/index.md b/ydb/docs/ru/core/faq/_includes/index.md
index c795c463d0..71eb9bb51f 100644
--- a/ydb/docs/ru/core/faq/_includes/index.md
+++ b/ydb/docs/ru/core/faq/_includes/index.md
@@ -4,5 +4,6 @@
{% if oss %}
* [SDK](../sdk.md)
{% endif %}
-* [YQL](../yql.md)
* [Ошибки](../errors.md)
+* [YQL](../yql.md)
+* [Serverless](../serverless.md)
diff --git a/ydb/docs/ru/core/faq/_includes/sdk.md b/ydb/docs/ru/core/faq/_includes/sdk.md
index bd5d6f1c62..648dcf4eb1 100644
--- a/ydb/docs/ru/core/faq/_includes/sdk.md
+++ b/ydb/docs/ru/core/faq/_includes/sdk.md
@@ -1,11 +1,5 @@
# SDK
-#### Почему может возникать ошибка «Status: OVERLOADED Error: Pending previous query completion» в C++ SDK?
-
-Q: При запуске двух запросов, пытаюсь получить ответ из фьючера от второго из них. Получаю: `Status: OVERLOADED Why: <main>: Error: Pending previous query completion`.
-
-A: Сессия в SDK однопоточная. Если нужно параллельно использовать несколько запросов, нужно создавать несколько сессий.
-
#### Что делать, если SDK экстренно завершает работу при завершении работы приложения? {#what-to-do-if-the-sdk-crashes-urgently-when-the-app-is-shut-down}
Не следует оборачивать компоненты SDK в синглтон, так как время их жизни не должно превышать время выполнения функции `main()`. Так как при уничтожении клиента происходит опустошение пулов сессий, требуется возможность перехода по сети. Но gPRC содержит глобальные статические переменные, которые к этому времени уже могут быть разрушены. Таким образом, работа gRPC невозможна. При необходимости сделать драйвер глобальным объектом, на драйвере нужно вызвать функцию `Stop(true)` перед выходом из `main()`.
diff --git a/ydb/docs/ru/core/faq/_includes/yql.md b/ydb/docs/ru/core/faq/_includes/yql.md
index 6fd284b998..2b978d4033 100644
--- a/ydb/docs/ru/core/faq/_includes/yql.md
+++ b/ydb/docs/ru/core/faq/_includes/yql.md
@@ -37,22 +37,6 @@ WHERE Key LIKE "some_prefix%";
1000 строк — ограничение на размер одного результата для YQL запроса. В случае если результат запроса был обрезан, он будет помечен флагом `Truncated`. Чтобы получить большее количество строк из таблицы, можно воспользоваться [постраничным выводом](../../best_practices/paging.md) или операцией `ReadTable`.
-#### Что делать, если при запросе я получаю ошибку «Datashard: Reply size limit exceeded»? {#reply-size-exceeded}
-
-Данная ошибка означает, что при выполнении запроса с одного из участвующих в нем даташардов была попытка вернуть более 50 МБ данных, что превышает допустимый лимит.
-
-Рекомендации:
-
-* Общая рекомендация — уменьшить объем данных, обрабатываемых в транзакции.
-* Если выполняется операция `Join`, стоит убедиться, что она выполняется способом [Index lookup Join](#index-lookup-join).
-* Если осуществляется простая выборка, стоит убедиться, что она делается по ключам, или добавить `LIMIT` в запрос.
-
-#### Что делать, если при запросе я получаю ошибку «Datashard program size limit exceeded»? {#program-size-exceeded}
-
-Данная ошибка означает, что размер программы (в сумме со значениями параметров) для одного из даташардов превысил лимит в 50 МБ. Чаще всего это означает попытку записать в таблицы базы более 50 МБ данных в одной транзакции. В качестве записей учитываются все модифицирующие операции в транзакции, такие как `UPSERT`, `REPLACE`, `INSERT`, `UPDATE`.
-
-Необходимо уменьшить суммарных объем записей в одной транзакции. В общем случае не рекомендуется объединять в единую транзакцию запросы, которые логически не требуют транзакционности. В случае добавления/обновления данных батчами, рекомендуется уменьшить размер одного батча до значений, не превышающих нескольких мегабайт.
-
#### Как обновить только те значения, ключей которых нет в таблице? {#update-non-existent}
Можно использовать операцию `LEFT JOIN`, чтобы пометить отсутствующие в таблице ключи, после чего обновить их значения:
diff --git a/ydb/docs/ru/core/faq/all.md b/ydb/docs/ru/core/faq/all.md
index 5c253cdb17..5c44fdc0ae 100644
--- a/ydb/docs/ru/core/faq/all.md
+++ b/ydb/docs/ru/core/faq/all.md
@@ -1,9 +1,5 @@
{% include [all.md](_includes/all.md) %}
-## Serverless {#serverless}
-
-{% include notitle [serverless.md](serverless.md) %}
-
{% if audience != "external" %}
<!-- common_yndx is to be here, but currently breaks the build with contributors -->