diff options
author | pnv1 <pnv1@yandex-team.ru> | 2022-03-24 16:01:17 +0300 |
---|---|---|
committer | pnv1 <pnv1@yandex-team.ru> | 2022-03-24 16:01:17 +0300 |
commit | fc131012dada714b26d872d3532bde52e4aba2b1 (patch) | |
tree | 6f037b80647a7ddc63ab3e407bba2c7751d8bb72 | |
parent | 04156efbfd06d47a7b749159b1a00a756fa5c41b (diff) | |
download | ydb-fc131012dada714b26d872d3532bde52e4aba2b1.tar.gz |
Add some optimisations to FAQ section, KIKIMR-14347
ref:5027a4927001215999e4493ef99de22ed6761175
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/all.md | 8 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/common.md | 4 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/errors.md | 22 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/index.md | 3 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/sdk.md | 6 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/_includes/yql.md | 16 | ||||
-rw-r--r-- | ydb/docs/ru/core/faq/all.md | 4 |
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 --> |