---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/concepts/query_execution/scan_query.md
  - https://ydb.tech/docs/ru/concepts/query_execution/scan_query.md
sourcePath: ru/core/concepts/query_execution/scan_query.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

<!-- source: ru/concepts/_includes/scan_query.md -->
# Скан запросы (Scan Query) в YDB

<!-- source: ru/_includes/scan_query_deprecated_warning.md -->
{% note warning %}

Использование `ScanQuery` не рекомендуется для новых сценариев. Для выполнения запросов используйте стандартные механизмы.

Подробнее см. в разделе [Выполнение запросов](https://ydb.tech/docs/ru/reference/ydb-cli/yql.md).

Исключение — выполнение длительных (более 5 минут) запросов к строчным таблицам. В этом случае мы по-прежнему рекомендуем использовать `ScanQuery`, так как стандартные механизмы выполнения запросов пока не полностью поддерживают этот сценарий.

{% endnote %}
<!-- endsource: ru/_includes/scan_query_deprecated_warning.md -->

Скан запросы (Scan Queries) — это отдельный интерфейс доступа к данным, предназначенный в первую очередь для выполнения аналитических ad-hoc запросов над базой данных.

Данный способ исполнения запросов обладает следующими отличительными свойствами:

* Это только *Read-Only* запросы.
* В режиме *SERIALIZABLE_RW* берется снапшот данных, над которым в дальнейшем и происходит вся работа. В результате влияние на поток OLTP-транзакций минимальное (только снятие снапшота).
* Результат запроса — это стрим данных ([gRPC stream](https://grpc.io/docs/what-is-grpc/core-concepts/#server-streaming-rpc)). Таким образом, у скан запросов нет лимита на количество строк в результате.
* Из-за высоких накладных расходов подходит только для ad-hoc запросов.

{% note info %}

Через интерфейс *Scan Queries* можно выполнять запросы к [системным представлениям](https://ydb.tech/docs/ru/dev/system-views.md).

{% endnote %}

Скан запросы не считаются полноценным способом выполнения OLAP-запросов, поскольку они обладают рядом технических ограничений (которые со временем будут сняты):

* Длительность запроса ограничена 10 минутами.
* Многие операции (включая сортировку) выполняются целиком в памяти, поэтому на сложных запросах можно получить ошибку нехватки ресурсов.
* Для соединений на текущий момент используется только одна стратегия — *MapJoin* (aka *Broadcast Join*), где «правая» таблица конвертируется в карту, поэтому она должна быть не более единиц гигабайт.
* Не поддерживается prepared-форма, т.е. на каждый вызов происходит компиляция запроса.
* Нет оптимизаций под точечные чтения и чтения небольших диапазонов данных.
* В SDK не поддерживается автоматический retry.

Для работы с OLAP-нагрузками в YDB существует специализированный тип таблиц — [колоночные](https://ydb.tech/docs/ru/concepts/datamodel/table.md#column-oriented-tables) таблицы. Они хранят данные каждого столбца отдельно от других столбцов. Благодаря этому при выполнении запроса считываются только те столбцы, которые непосредственно участвуют в запросе.

{% note info %}

Несмотря на то, что *Scan Queries* явно не мешают выполнению OLTP-транзакций, они все же используют общие ресурсы базы: CPU, память, диск, сеть. Поэтому выполнение тяжелых запросов **может привести к голоданию по ресурсам**, что скажется на производительности всей базы.

{% endnote %}

## Как воспользоваться {#how-use}

Как и другие виды запросов, *Scan Queries* доступны через  [CLI](https://ydb.tech/docs/ru/reference/ydb-cli/scan-query.md) и [SDK](https://ydb.tech/docs/ru/reference/ydb-sdk/index.md).


### C++ SDK {#cpp}

Для запуска запроса через механизм *Scan Queries* предназначены 2 метода в классе `Ydb::TTableClient`:

```cpp
class TTableClient {
 ...
 TAsyncScanQueryPartIterator StreamExecuteScanQuery(const TString& query,
 const TStreamExecScanQuerySettings& settings = TStreamExecScanQuerySettings());

 TAsyncScanQueryPartIterator StreamExecuteScanQuery(const TString& query, const TParams& params,
 const TStreamExecScanQuerySettings& settings = TStreamExecScanQuerySettings());
 ...
};
```
<!-- endsource: ru/concepts/_includes/scan_query.md -->
