---
metadata:
  - name: generator
    content: Diplodoc Platform v5.61.1
alternate:
  - https://ydb.tech/docs/en/dev/query-execution-optimization/parameterized-queries.md
  - https://ydb.tech/docs/ru/dev/query-execution-optimization/parameterized-queries.md
  - href: https://ydb.tech/docs/ru/dev/query-execution-optimization/parameterized-queries.md
    type: text/markdown
    title: Markdown version
  - href: https://ydb.tech/docs/ru/llms.txt
    rel: describedby
sourcePath: ru/core/dev/query-execution-optimization/parameterized-queries.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Параметризованные запросы и повторная компиляция

Компиляция запроса требует времени и ресурсов, поэтому в YDB предусмотрен [кэш компиляции](https://ydb.tech/docs/ru/concepts/glossary.md#compile-cache). Результат компиляции сохраняется в кэше на [узле](https://ydb.tech/docs/ru/concepts/glossary.md#node) кластера и переиспользуется только при **точном совпадении текста** запроса. Поэтому, если в коде приложения значения попадают в YQL через конкатенацию или форматирование строк, при каждом новом наборе данных сервер получает **другой текст** и компилирует его заново — хотя структура SQL может оставаться той же.

Последствия:

- увеличивается задержка на этапе компиляции;
- растёт нагрузка на CPU узлов;
- при большом числе уникальных текстов ухудшается переиспользование ограниченного кэша на узле.

Избежать лишней компиляции помогает **параметризованный запрос**: текст YQL фиксирован, а входные значения передаются отдельно через [именованные параметры](https://ydb.tech/docs/ru/yql/reference/syntax/declare.md) (например, `$userId`). Ниже оба подхода сравниваются на одном примере.

## Подстановка значений в текст запроса

Приложение подставляет значения прямо в текст запроса:

```yql
SELECT id, name FROM users WHERE id = 123 AND status = "active";
SELECT id, name FROM users WHERE id = 456 AND status = "inactive";
```

Запросы отличаются только значениями, но тексты разные — для сервера это два разных запроса, и каждый компилируется отдельно.

## Передача значений параметрами

Приложение передаёт значения отдельно от текста, текст запроса не меняется:

```yql
DECLARE $userId AS Uint64;
DECLARE $status AS Utf8;

SELECT id, name FROM users WHERE id = $userId AND status = $status;
```

Сервер обрабатывает вызовы такого запроса по-разному:

1. **Первый вызов** — сервер компилирует запрос и сохраняет результат в кэше на узле.
2. **Следующие вызовы** — если текст уже есть в кэше, используется готовый результат: меняются только значения `$userId` и `$status`, повторная компиляция не требуется.

Параметрами передаются только значения: имя таблицы или порядок сортировки задать параметром нельзя, и при их изменении текст запроса становится другим.

Содержимое кэша компиляции смотрите в разделе [Кэш компиляции запросов](https://ydb.tech/docs/ru/dev/system-views.md#compile-cache-queries), а время компиляции при выполнении запросов — в [топах запросов](https://ydb.tech/docs/ru/dev/system-views.md#top-queries) (поле `CompileDuration`).

Размер и настройки кэша, флаг `KeepInCache`, синтаксис [`DECLARE`](https://ydb.tech/docs/ru/yql/reference/syntax/declare.md) и передача параметров из кода описаны в разделе [Параметризованные запросы](https://ydb.tech/docs/ru/reference/ydb-sdk/parameterized_queries.md) справки YDB SDK.

## Смотрите также

- [Использование планов при оптимизации запросов](https://ydb.tech/docs/ru/dev/query-execution-optimization/query-plans-optimization.md)
- [Кэш компиляции запросов](https://ydb.tech/docs/ru/dev/system-views.md#compile-cache-queries)
- [Параметризованные запросы](https://ydb.tech/docs/ru/reference/ydb-sdk/parameterized_queries.md) (справка SDK)
- [Выполнение параметризованных запросов](https://ydb.tech/docs/ru/reference/ydb-cli/parameterized-query-execution.md) (справка CLI)
- [Примеры приложений](https://ydb.tech/docs/ru/dev/example-app/index.md#param-queries)
- [Обзор оптимизации запросов](https://ydb.tech/docs/ru/dev/query-execution-optimization/index.md)
