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

# Работа с базами данных YDB

YDB может выступать в качестве внешнего источника данных для другой базы YDB. В данном разделе рассматривается организация совместной работы двух независимых баз данных YDB в режиме обработки федеративных запросов.

Для подключения к внешней базе YDB со стороны другой базы YDB, выступающей в роли движка обработки федеративных запросов, на последней требуется выполнить следующие шаги:

1. Подготовить аутентификационные данные для доступа к удалённой базе YDB. В настоящее время в федеративных запросах к YDB доступен метод аутентификации по [логину и паролю](https://ydb.tech/docs/ru/security/authentication.md#static-credentials) (остальные методы не поддерживаются). Пароль к внешней базе сохраняется в виде [секрета](https://ydb.tech/docs/ru/concepts/datamodel/secrets.md):

   ```yql
    CREATE SECRET ydb_datasource_user_password WITH (value = "<password>");
    ```

1. Создать [внешний источник данных](https://ydb.tech/docs/ru/concepts/datamodel/external_data_source.md), описывающий стороннюю базу YDB. Параметр `LOCATION` содержит сетевой адрес экземпляра YDB, к которому осуществляется сетевое подключение. В `DATABASE_NAME` указывается имя базы данных (например, `local`). Для аутентификации во внешнюю базу используются значения параметров `LOGIN` и `PASSWORD_SECRET_PATH`. Включить шифрование соединений к внешней базе данных можно с помощью параметра `USE_TLS="TRUE"`. Если шифрование включено, то в поле `<port>` параметра `LOCATION` необходимо указать порт gRPCs внешней YDB, в противном случае - порт gRPC.

    ```yql
    CREATE EXTERNAL DATA SOURCE ydb_datasource WITH (
        SOURCE_TYPE="Ydb",
        LOCATION="<host>:<port>",
        DATABASE_NAME="<database>",
        AUTH_METHOD="BASIC",
        LOGIN="user",
        PASSWORD_SECRET_PATH="ydb_datasource_user_password",
        USE_TLS="TRUE"
    );
    ```

1. <!-- source: ru/concepts/query_execution/federated_query/_includes/connector_deployment.md -->
    Развернуть [коннектор](https://ydb.tech/docs/ru/concepts/query_execution/federated_query/architecture.md#connectors)  и [настроить](https://ydb.tech/docs/ru/devops/deployment-options/manual/federated-queries/index.md)  динамические узлы YDB на взаимодействие с ним. Также необходимо обеспечить сетевой доступ с динамических узлов YDB к внешнему источнику данных (по адресу, указанному в параметре `LOCATION` запроса `CREATE EXTERNAL DATA SOURCE`). В случае, если на предыдущем шаге было включено шифрование сетевых соединений к внешнему источнику, коннектор будет использовать системные корневые сертификаты (более подробно о настройке TLS можно узнать в [инструкции](https://ydb.tech/docs/ru/devops/deployment-options/manual/federated-queries/connector-deployment.md) по разворачиванию коннектора).
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/connector_deployment.md -->
1. [Выполнить запрос](#query) к внешнему источнику данных.

## Синтаксис запросов {#query}

Для извлечения данных из таблиц внешней базы YDB используется следующая форма SQL-запроса:

```yql
SELECT * FROM ydb_datasource.`<table_name>`
```

где:

- `ydb_datasource` - идентификатор внешнего источника данных;
- `<table_name>` - полное имя таблицы внутри [иерархии](https://ydb.tech/docs/ru/concepts/architecture.md#ydb-hierarchy) каталогов в базе данных YDB, например, `table`, `dir1/table1` или `dir1/dir2/table3`.

В случае, если таблица находится на верхнем уровне иерархии (не принадлежит ни одному из каталогов), допускается не заключать имя таблицы в обратные апострофы "\`":

```yql
SELECT * FROM ydb_datasource.<table_name>
```

## Ограничения {#limitations}

При работе с внешними источниками данных YDB существует ряд ограничений:

1. <!-- source: ru/concepts/query_execution/federated_query/_includes/supported_requests.md -->
   Внешние источники доступны только для чтения данных через запросы `SELECT`. Запросы, модифицирующие таблицы во внешних источниках, движком обработки федеративных запросов в настоящее время не поддерживаются.
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/supported_requests.md -->
1. <!-- source: ru/concepts/query_execution/federated_query/_includes/predicate_pushdown_preamble.md -->
   Система обработки федеративных запросов YDB умеет передавать исполнение некоторых частей запроса системе, выступающей в качестве источника данных. Фрагменты запроса передаются сквозь YDB непосредственно во внешнюю систему и обрабатываются внутри неё. С помощью этой оптимизации, которая носит название «пушдауна предикатов» (predicate pushdown), удаётся значительно снизить объём данных, передаваемых от источника к движку обработки федеративных запросов. Благодаря этому снижается нагрузка на сеть и экономятся вычислительные ресурсы YDB.

   Частный случай пушдауна предикатов, при котором выполняется передача фильтрующих выражений, указанных после ключевого слова `WHERE`, называется «пушдауном фильтров» (filter pushdown). Пушдаун фильтров возможен при использовании:
   <!-- endsource: ru/concepts/query_execution/federated_query/_includes/predicate_pushdown_preamble.md -->

    |Описание|Пример|Ограничение|
    |---|---|---|
    |Фильтров вида `IS NULL`/`IS NOT NULL`|`WHERE column1 IS NULL` или `WHERE column1 IS NOT NULL`||
    |Логических условий `OR`, `NOT`, `AND` и круглых скобок для управление приоритетом вычислений. |`WHERE column1 IS NULL OR (column2 IS NOT NULL AND column3 > 10)`.||
    |[Операторов сравнения](../../../yql/reference/syntax/expressions.md#comparison-operators) c другими колонками или константами. |`WHERE column1 > column2 OR column3 <= 10`.||
    |Оператора сопоставления строк с образцом `LIKE`.|`WHERE column1 LIKE '_abc%'`|В настоящее время поддерживается пушдаун только простых паттернов, основанных на префиксах (`'abc_'`, `'abc%'`), суффиксах (`'_abc'`, `'%abc'`) или поиске подстроки в строке (`'_abc_'`, `'%abc%'`, `'_abc%'`, `'%abc_'`). При необходимости пушдауна более сложных паттернов рекомендуется воспользуется `REGEXP`.|
    |Оператора сопоставления строк с образцом `REGEXP`.|`WHERE column1 REGEXP '.*abc.*'`||

    При использовании других видов фильтров пушдаун на источник не выполняется: фильтрация строк внешней таблицы будет выполнена на стороне федеративной YDB, что означает, что YDB выполнит полное чтение (full scan) внешней таблицы в момент обработки запроса.

    Поддерживаемые типы данных для пушдауна фильтров:

    |Тип данных YDB|
    |----|
    |`Bool`|
    |`Int8`|
    |`Uint8`|
    |`Int16`|
    |`Uint16`|
    |`Int32`|
    |`Uint32`|
    |`Int64`|
    |`Uint64`|
    |`Float`|
    |`Double`|
    |`String`|
    |`Utf8`|


## Поддерживаемые типы данных

При работе с таблицами, размещёнными во внешней базе YDB, пользователям доступен ограниченный набор типов данных. Все остальные типы, за исключением перечисленных ниже, не поддерживаются. В некоторых случаях производится преобразование типов, то есть колонки таблицы из внешней базы YDB меняют свой тип после вычитывания этой таблицы базой YDB, обрабатывающей федеративный запрос.

|Тип данных внешнего источника YDB|Тип данных в федеративной YDB|
|---------|---------|
|`Bool`|`Bool`|
|`Int8`|`Int8`|
|`Int16`|`Int16`|
|`Int32`|`Int32`|
|`Int64`|`Int64`|
|`Uint8`|`Uint8`|
|`Uint16`|`Uint16`|
|`Uint32`|`Uint32`|
|`Uint64`|`Uint64`|
|`Float`|`Float`|
|`Double`|`Double`|
|`String`|`String`|
|`Utf8`|`Utf8`|
|`Date`|`Date`|
|`Datetime`|`Datetime`|
|`Timestamp`|`Timestamp`|
|`Json`|`Json`|
|`JsonDocument`|`Json`|
