Кубы Cubisio позволяют создавать срезы, использующие источники с разными БД (в том числе разными объектами БД в рабочей области). Для выполнения таких запросов движок автоматически использует механизм ообратного вызова, при котором основной запрос в целевую БД включает запрос к API Cubisio для получения данных.
В общем случае гетеротенный запрос разбивается на несколько запросов, один из которых является основным, запросом верхнего уровня, остальные - удаленными, данные из которых извлекаются через API Cubisio.
По умолчанию, в случае наличия в запросе гетерогенных источников, основной БД выбирается внутреннее in-memory хранилище Cubisio, задача которого получить данные из внешних источников и выполнить необходимые преобразования (например, пересечения). В таком случае все использованные в запросе БД рассматриваются как внешние, в результате чего производится загрузка данных в память, что занимает время.
Важно отметить, что в любом случае использование гетерогенных запросов (срезов с источниками в разных БД) требует выгрузки данныхв память. Поэтому важно составлять запросы с полным пониманием структуры запроса и размеров коллекций, обрабатываемых в месте пересечения гетерогенных запросов. Во время отладки таких запросов рекомендуется использовать $limit.
Для уменьшения количества внешних источников в запросе и существенной оптимизации скорости выполнения гетерогенных запросов, например, для случаев пересечения "больших" таблиц с "небольшими", необходимо обеспечить, чтобы основной была выбрана БД, в которой предполагается обрбаотка больших локальных коллекций и небольших внешних (полученных через API).
Если БД поддерживает механизм обратного вызова, то в настройках соединения необходимо включить опцию "Использовать механизм обратного вызова", в таком случае у данной БД будет приоритет при выборе как основной.
Для работы механизма обратного вызова должны быть обеспечены следующие требования:
Опции конфигурации:
datacube.query.engine.loopback.overrideUrl
- переопределение адреса, по которому СУБД обращается к Cubisio (по умолчанию используется публичный адрес сервера), например datacube.query.engine.loopback.overrideUrl = "http://172.17.0.1:8899"
, дляdatacube.query.engine.loopback.limit
- задаёт максимальное число записей/строк для выдаче через обратный вызов (добавляется в запрос при отсутствии явно заданно $limit в целях защиты от выкачивания всех данных при ошибках в запросе), например datacube.query.engine.loopback.limit = 200
datacube.query.engine.loopback.clickhouse.api.maxsize
и datacube.query.engine.loopback.postgresql.api.maxsize
- задаёт в байтах максимальный размер вычачи api при обратном вызове (так же в целях защиты БД от перенагрузки при ошибках в запросе)