BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » DuckDB для аналитических платформ » Планировщик запросов и оптимизатор DuckDB

Планировщик запросов и оптимизатор DuckDB

DuckDB выступает как аналитическая СУБД с фокусом на столбцово-ориентированном хранении и векторной обработке. Его планировщик запросов - центральный компонент, который преобразует SQL в эффективный план выполнения, сочетая правила преобразований и эвристики отбора оптимального пути. В рамках данной главы рассмотрены архитектура планировщика, этапы преобразований, принципы оценки стоимости операций и межмодульные взаимодействия, необходимое для внедрения DuckDB в современных data stack.

Краткое введение к теме задает контекст: DuckDB строит планы на основе логического представления запроса, затем применяет набор правил и моделей затрат для формирования физического плана, который максимально полно использует векторизированную обработку столбцов и возможности кода-генерации. На практике это означает эффективное pushdown’ирование фильтров и проекций, выбор операторов соединения и агрегирования, а также адаптацию плана под данные статистики и характеристики источников.

  • Определение ключевых компонентов планировщика: Binder, LogicalPlan, Optimizer, PhysicalPlan и механизм статистики.
  • Эволюция запроса от текста SQL к физическому плану через конвейер правил и анализа затрат.
  • Роль векторной обработки и кодогенерации в выборе и реализации физических операторов.
  • Инструменты диагностики планов: EXPLAIN и EXPLAIN ANALYZE, а также интеграция с внешними данными.
  • Практические принципы оптимизации аналитических запросов в DuckDB и сценарии внедрения.

     

Архитектура планировщика DuckDB

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

 

Ключевые компоненты и их роль:

  • Binder и логический план: связывание имен, разрешение типов, построение выражений как деревьев вычислений. На этом этапе формируется абстрактное представление, пригодное для последующего преобразования.
  • Оптимизатор: применяет набор правил преобразований, включаяpushdown фильтров, удаление лишних столбцов, упрощение выражений и попытки реорганизации операций для уменьшения объемов данных на пути выполнения.
  • Движок физического плана: выбирает конкретные операторы (например, сортировку, хеш-джойн, объединение по сути и т. п.) и порядок их выполнения. В DuckDB акцент сделан на векторизированной обработке и возможности применения кодогенерации для узкоспециализированных операторов.
  • Модуль статистики и стоимости: оценивает количество строк, распределение значений и селективность фильтров, формируя оценку стоимости под разные физические планы. Эти оценки критически влияют на выбор оптимального плана.

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

EXPLAIN SELECT region, SUM(sales) FROM fact_sales
WHERE year = 2023 AND region = 'EU'
GROUP BY region;

Элементарный пример демонстрирует механизм доступа к плану на стадии объяснения. В ответ DuckDB обычно возвращает структурированное представление: логический план, оптимизированный логический план и физический план с оценкой стоимости и пояснениями по каждой операции.

 

Логический и физический план: что находится в DuckDB

Логический план представляет запрос в виде абстрактного дерева операций: выборки, проекции, фильтры, соединения, агрегации. Этот уровень не подразумевает конкретных реализаций исполнения: он задаёт семантику и зависимость между операциями. Физический план - конкретная реализация, где каждая операция имеет выбранный алгоритм исполнения и параметры реализации (например, тип соединения и способ агрегации).

В DuckDB векторизация служит основой физического плана: данные обрабатываются пакетами (батчами) фиксированного размера, что позволяет детерминированно применять SIMD-оптимизации и снижать накладные расходы на чтение, фильтрацию и агрегацию. Это преимущество становится особенно заметным на больших аналитических нагрузках с агрегатами по колонкам.

 

Ключевые аспекты:

  • Операторы линейного и сложного типа: projection, filter, scan, join (hash join, sort-merge join, nested loop), агрегация (hash и sort-based).
  • Путь от логического узла к физическому оператору: выбор реализаций в зависимости от статистики и контекста выполнения.
  • Векторизация и кодогенерация: DuckDB применяет компиляцию узконаправленных операторов через LLVM там, где это повышает производительность, например для фильтрации и агрегации с простыми выражениями.
  • Стратегия памяти и кеширования: планировщик учитывает требования к памяти, распределение батчей и обход внешних источников для минимизации задержек.

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

Упоминание технологий: DuckDB опирается на подходы столбцового хранения и векторной обработки, близкие к идеям MonetDB и Apache Arrow-ориентированной экосистемы. В части реализации используются принципы кода-генерации через LLVM для узкоспециализированных операторов, что отражает тенденцию современных аналитических движков к динамической адаптации к данным.

 

Правила оптимизации и модель затрат

Оптимизация в DuckDB построена на сочетании правил преобразований и моделирования затрат. Это позволяет не только перестроить выражения, но и выбрать эффективный набор физических операторов и их порядок. Основной логикой служит идея минимизации общей стоимости выполнения запроса при заданной памяти и аппаратной конфигурации.

 

Основные направления оптимизации:

  • Pushdown и фильтры: фильтры переносятк к сканеру как можно глубже, чтобы минимизировать объём данных, читаемых в дальнейшем. Это особенно эффективно на столбцовых форматах и при наличии селективных условий.
  • Projection и column pruning: исключение лишних столбцов на ранних стадиях снижает расход памяти и вычислительную нагрузку.
  • Упрощения выражений и константная складывающаяся оптимизация: упрощение выражений, разворот логических условий, устранение избыточных вычислений.
  • Оптимизация порядка соединений: DuckDB применяет подходы на базе правил и оценки затрат, чтобы выбрать эффективный порядок выполнения соединений в многожвенных планах. В сложных запросах может применяться переработка дерева соединений в целях кэширования результатов и уменьшения памяти.
  • Выбор алгоритмов соединения и агрегации: в зависимости от размеров входов, доступности памяти и наличия индикаторов порядка, выбираются hash-join, sort-merge и другие реализации. Агрегирование может использовать хеш-агрегацию или сортовую агрегацию в зависимости от структуры данных и выражений.
  • Стратегии исключений и обработки NULL: DuckDB учитывает нюансы обработки NULL и тривиальные случаи при агрегации, чтобы сохранить корректность поведения и производительность.

     

Стратегия покрытия статистикой:

  • Статистика диапазонов (histograms), уникальные значения (NDV), оценки селективности и кардинальности - критически важны для расчёта стоимости. Они влияют на выбор порядка соединений и типов операторов.
  • Регулярные обновления статистик через ANALYZE или автоматическую инспекцию данных помогают адаптировать планы к реальному характеру данных.

Важный элемент: объяснение плана. Команда EXPLAIN позволяет увидеть, какие правила применялись и какие операторы выбраны на каждом шаге. EXPLAIN ANALYZE добавляет фактическое время выполнения и количество строк, что полезно для диагностики.

EXPLAIN ANALYZE SELECT region, SUM(sales) FROM fact_sales
WHERE year = 2023 AND region = 'EU'
GROUP BY region;

Эта команда возвращает не только структуру плана, но и статистику выполнения, дающую индикацию узких мест и возможностей дальнейшей оптимизации.

 

Инструменты диагностики планов и интеграции в data stack

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

  • Экспликация плана: через EXPLAIN (и EXPLAIN ANALYZE) можно увидеть логику планирования, вложенность операторов и предполагаемую стоимость.
  • Глубокая детализация операторов: DuckDB предоставляет разбор конкретных реализаций сканирования, соединения и агрегации, включая информацию о параметрах и размерах батчей.
  • Интеграция с внешними данными: DuckDB поддерживает внешние источники (например, файловые таблицы, внешние схемы). Планировщик адаптирует выбор методов доступа в зависимости от источника, включая использование разделов данных, параллелизм и сценарии вытягивания данных по частям.
  • Визуализация процессов: в рамках системы мониторинга и интеграции с инструментами репликации плана, можно визуализировать дерево плана для аналитиков и инженеров.

     

Практические рекомендации:

  • При сложных запросах с несколькими таблицами и агрегациями используйте EXPLAIN ANALYZE для выявления реального времени на каждом операторе.
  • Следите за статистикой: периодически обновляйте статистику с помощью ANALYZE, особенно после значительной загрузки данных, загрузок новых партий или изменений кэширования.
  • Для больших внешних источников старайтесь минимизировать объём данных на ранних стадиях посредством эффективного pushdown и фильтрации.

     

Практические сценарии оптимизации аналитических SQL

  1. Фильтрация на ранних стадиях и проекции только нужных столбцов
  • Применение фильтров как можно раньше в конвейере снижает обработку неактуальных данных и уменьшает объем памяти, необходимый для последующих операций.
  • Пример: выбор только необходимых столбцов из широких фактов и агрегационных столбцов.
  1. Применение эффективной агрегации
  • При группировке рекомендуется использовать стратегию, соответствующую характеру входа: хеш-агрегацию для больших наборов данных и сортовую агрегацию там, где данные уже упорядочены или частично упорядочены.
  1. Оптимизация соединений
  • Векторизация и кеширование: выбор алгоритма соединения, учитывая размер входов и доступную память, чтобы минимизировать обращения к памяти и временные задержки.
  • Правильное использование индексов/партирования: для внешних таблиц и разделов данных стоит учитывать сегментацию и возможность параллельной обработки.
  1. Использование статистики и ANALYZE
  • Регулярная актуализация статистик позволяет планировщику лучше оценивать стоимость и выбирать более эффективные планы в долгосрочной перспективе.
  1. Диагностика и планирование
  • Применение EXPLAIN ANALYZE в продвинутых сценариях поможет выявить узкие места и подобрать альтернативы, например изменение порядка соединений или изменение оператора агрегации.
  1. Интеграция с data stack
  • DuckDB хорошо сочетается с Python, R и различными инструментами для визуализации и аналитики. При этом планировщик адаптируется под источники данных и формат их представления.
  1. Примеры практических решений
  • Вендор-специфические настройки: например, настройка памяти под векторизированную обработку и конкретные параметры планировщика в зависимости от доступной памяти и аппаратной архитектуры.

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

 

Визуализация и диагностика планов

Эффективная диагностика требует системного подхода к анализу плана и исполнению. Рекомендуются следующие шаги:

  • Сначала просмотреть общий профиль плана: какие типы операторов используются и в каком порядке они применяются.
  • Затем оценить стоимость и ресурсную потребность каждого оператора: объем чтения, пропускная способность, задержки на ожидание данных.
  • На последнем шаге посмотреть фактические метрики через EXPLAIN ANALYZE: время, число обрабатываемых строк, использование памяти.

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

 

Key takeaways

  • Планировщик DuckDB обеспечивает эффективное преобразование SQL в физический план с использованием логического и физического слоев, где векторизация и кодогенерация повышают производительность.
  • Оптимизация строится на сочетании правил преобразований и оценки затрат, с акцентом на pushdown фильтров, проекции и выбор операторов выполнения.
  • Стратегия использования статистики и аналитики исполнения играет критическую роль в выборе плана, особенно при сложных запросах с множеством присоединений и агрегаций.
  • EXPLAIN и EXPLAIN ANALYZE являются основными инструментами диагностики планов и позволяют выявлять узкие места и проверять влияние изменений.
  • Интеграция DuckDB в modern data stack требует внимания к источникам данных, внешним таблицам и управлению статистикой.
  • Векторизация и кодогенерация - ключевые механизмы достижения высокой производительности на аналитических нагрузках в DuckDB.
  • Практические рекомендации по оптимизации включают обновление статистики, минимизацию чтения данных, выбор эффективных алгоритмов соединения и агрегации, а также применениеExplain Analyse для корректировки планов.

     

FAQ

  1. Что такое логический план и зачем он нужен в DuckDB?
  • Логический план - это абстракция SQL-запроса в виде дерева операций, которая имеет смысл без привязки к конкретной реализации. Он отделяет семантику запроса от деталей исполнения и служит основой для последующего преобразования в физический план. Преимущество состоит в возможности применения правил оптимизации и анализа сортировки операций до выбора конкретных физических операторов.

 

  1. Какие типы физических операторов используются DuckDB?
  • DuckDB реализует набор физических операторов, включая сканирование таблиц, фильтрацию, проектирование, хеш- и сортовую агрегацию, различные виды соединений (hash join, sort-merge join, nested loop) и возможности для векторной обработки. Выбор конкретной реализации зависит от характеристик данных и доступной памяти.

 

  1. Как DuckDB оценивает планы и выбирает лучший?
  • DuckDB применяет cost-based optimization: оценивает селективность фильтров, кардинальность, размер входов и стоимость операций. На основе этих оценок формируется физический план, который минимизирует обобщенную стоимость выполнения и обеспечивает эффективное использование памяти и процессора. В процессе оцениваются как регулярные операции, так и зависимости между операциями, чтобы снизить общий объем данных на пути выполнения.

 

  1. Какие правила оптимизации применяются чаще всего?
  • Чаще всего применяются правила pushdown фильтров, проекций и константного упрощения, а также перестройка порядка соединений и выбор между различными реализациями агрегации и соединения. Эти правила имеют целью минимизировать объем данных, которые проходят через конвейер и требуют дорогостоящей обработки.

 

  1. Как включить подробное объяснение плана в DuckDB?
  • Распространённая практика - использовать EXPLAIN для вывода структуры плана, а EXPLAIN ANALYZE - для получения фактической статистики выполнения. Это позволяет понять, какие преобразования применяются и какие участки запроса являются узкими местами.

 

  1. Какую роль играет статистика в планировании?
  • Статистика (NDV, гистограммы, оценки селективности) влияет на оценку затрат и выбор порядка объединения, типов операций и фильтров. Обновление статистики посредством ANALYZE обеспечивает корректную оценку для изменившихся данных и улучшает качество планирования.

 

  1. Как DuckDB обрабатывает внешние таблицы и источники данных?
  • При работе с внешними источниками DuckDB адаптирует план под конкретный источник, выбирая подходящие операторы доступа, учитывая ограничения по памяти и частоте обращения к данным. Это включает pushdown фильтров и минимизацию объема данных, которые нужно выгрузить или прочитать.

 

  1. В чем преимущество векторной обработки в плане DuckDB?
  • Векторизация обеспечивает обработку данных пакетами, что снижает накладные расходы на цикл интерпретации отдельных записей и позволяет использовать SIMD-инструкции процессора. Это повышает пропускную способность аналитических запросов, особенно для агрегаций и сложных фильтров на больших наборах данных.

 

  1. Как кодогенерация влияет на исполнение плана?
  • Генерация специализированного кода через LLVM для отдельных операторов позволяет существенно ускорить выполнение, особенно в узких местах, где повторяются одни и те же вычисления. Это уменьшает интерпретационные накладные расходы и увеличивает пропускную способность викторий по данным.

 

  1. Какие практические шаги можно предпринять, чтобы улучшить планы в реальном проекте?
  • Регулярно обновлять статистику, избегать чтения излишних столбцов и строк, использовать EXPLAIN ANALYZE для выявления узких мест, выбирать корректные операции соединения и агрегации в зависимости от данных, тестировать альтернативные планы и не забывать про внешние источники и их влияние на планирование.

 

← Предыдущая статья
Модуль выполнения и память: как DuckDB обрабатывает запросы
Следующая статья →
ACID и транзакции в встроенной аналитике

 

Узнать стоимость решенияЗапросить видео презентацию

Запросить видео презентацию Запросить доступ к демо стенду online Узнать стоимость лицензий

Задать вопрос

loading...

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • Группа компаний «Галакс» ведет свою деятельность с 2005 года, являясь в те годы дистрибьютором известных международных марок в ряде крупнейших торговых сетей России в сегменте аудио и видео аксессуаров. Активно работая в этом направлении и приобретая ценный опыт, начали создавать собственные торговые марки «GAL» и «VIXTER»

  • Торгово-производственному холдингу ТБМ, специализирующемуся на поставке комплектующих и фурнитуры для производства окон, дверей, стеклопакетов и мебели, был необходим аналитический инструмент для выявления узким мест и поиска зон роста бизнеса и, как результат, оптимизации процессов. Добиться этого можно было, только внедрив data-driven подход.

  • ООО «Ай Пи Ти Групп» (IPT Group) — многопрофильный консалтинговый холдинг, специализирующийся на юридическом и финансовом сопровождении бизнеса. IPT Group занимает высокие позиции в профессиональных рейтингах, входит в ТОП-30 лучших юридических компаний России по версии «Право.ru-300», Global Law Experts и др.

  • ПАО «Транснефть» – крупнейшая российская нефтепроводная компания. «Транснефть» обеспечивает транспортировку более 85% добываемых в России нефти и нефтепродуктов.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.