Маршрутизация запросов к данным

Содержание раздела
  1. Маршрутизации запросов к непартиционированным данным
  2. Определение категории запроса
  3. Стандартный порядок выбора типа датасорса
  4. Примеры запросов по категориям
    1. Реляционные запросы
    2. Запросы агрегации и группировки
    3. Запрос чтения по ключу
    4. Запрос неопределенной категории
  5. Маршрутизация запросов к партиционированным таблицам
  6. Маршрутизация запросов к партициям

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

Запросы к standalone-таблицам и прокси-таблицам всегда исполняются в одном датасорсе, так как данные этих таблиц не могут размещаться в нескольких датасорсах.

Маршрутизации запросов к непартиционированным данным

О маршрутизации запросов к партиционированным таблицам и партициям см. в секциях ниже.

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

  • Если в запросе есть ключевое слово DATASOURCE_TYPE с датасорсом для исполнения запроса, запрос направляется в указанный датасорс.
  • Если в запросе нет DATASOURCE_TYPE:
    • Если запрос предназначен для материализованного представления и содержит ключевое слово FOR SYSTEM_TIME, а в целевом представлении нет данных за запрашиваемый момент времени, запрос перенаправляется к исходным таблицам датасорса-источника, на которых построено это представление.
    • Иначе:
      1. Определяются те датасорсы, в которых можно выполнить запрос, — выбираются датасорсы, содержащие данные всех запрашиваемых логических сущностей.
      2. Определяется категория запроса.
      3. Выбирается наиболее оптимальный тип датасорса для исполнения запроса (см. ниже).
      4. Запрос направляется в один из датасорсов наиболее оптимального типа. Датасорс выбирается случайным образом среди всех датасорсов, которые относятся к наиболее оптимальному для запроса типу и содержат запрашиваемые сущности.

Подробнее о видах логических таблиц см. в разделе Логическая таблица > Виды таблиц.

Определение категории запроса

Категории запросов:

  1. Реляционный запрос (Relational) — запрос с ключевым словом JOIN и (или) подзапросами.
  2. Аналитический запрос (Analytical) — запрос с ключевым словом GROUP BY и агрегатными функциями.
  3. Запрос чтения по ключу (Dictionary) — запрос с условием WHERE на значения первичного ключа.
  4. Другой запрос (Undefined) — запрос, который не соответствует ни одной из предыдущих категорий.

Система определяет категорию запроса следующим образом: проверяет запрос на соответствие первой категории, и, если у него есть признаки этой категории, то система относит запрос к первой категории, иначе система проверяет запрос на соответствие второй категории и т.д. Например, запрос с ключевым словом JOIN соответствует первой категории («Реляционный запрос») независимо от наличия признаков других категорий — агрегации, группировки и чтения по ключу. Примеры запросов по категориям см. ниже.

Стандартный порядок выбора типа датасорса

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

Например, реляционный запрос будет по возможности исполнен в датасорсе типа ADB. Если в хранилище нет ни одного датасорса типа ADB или в этих датасорсах нет запрашиваемых данных, — запрос будет по возможности исполнен в датасорсе типа ADP, и далее в указанном ниже порядке.

Такой порядок выбора датасорса в зависимости от типа эффективно использует возможности каждой СУБД. При необходимости его можно изменить в конфигурации ноды.

Категория запроса Порядок выбора типа датасорса для исполнения запроса
1. Реляционный запрос 1. ADB, 2. ADP, 3. ADQM, 4. ADG
2. Аналитический запрос 1. ADQM, 2. ADB, 3. ADP, 4. ADG
3. Запрос чтения по ключу 1. ADG, 2. ADB, 3. ADP, 4. ADQM
4. Другой запрос 1. ADB, 2. ADP, 3. ADQM, 4. ADG

Наиболее полный синтаксис запросов доступен в СУБД ADB и ADP. СУБД ADG и ADQM имеют ограничения на выполнение запросов, вызванные особенностями этих СУБД (см. Поддержка SQL).

Примеры запросов по категориям

Реляционные запросы

Реляционный запрос:

SELECT * FROM marketing.sales AS s
JOIN marketing.stores AS st ON s.store_id = st.id

Реляционный запрос, который включает агрегацию, группировку и чтение по ключу (st.id):

SELECT st.id, st.category, SUM(s.product_units) AS product_amount
FROM marketing.stores AS st
JOIN marketing.sales AS s ON st.id = s.store_id
WHERE st.id <> 10004
GROUP BY st.id, st.category
ORDER BY product_amount DESC

Запросы агрегации и группировки

Запрос агрегации и группировки:

SELECT s.product_code, SUM(s.product_units) AS product_amount
FROM marketing.sales AS s
GROUP BY s.product_code
ORDER BY product_amount ASC

Запрос агрегации и группировки, который включает чтение по ключу (s.id):

SELECT s.product_code, SUM(s.product_units) AS product_amount
FROM marketing.sales AS s
WHERE s.id > 20000
GROUP BY s.product_code

Запрос чтения по ключу

SELECT * FROM marketing.sales as s
WHERE s.id BETWEEN 1001 AND 2000

Запрос неопределенной категории

SELECT * FROM marketing.sales AS s
WHERE s.product_units > 2  

Маршрутизация запросов к партиционированным таблицам

Запросы на чтение и выгрузку данных из партиционированных таблиц маршрутизируются следующим образом:

  • Если запрос содержит ключевое слово DATASOURCE_TYPE, запрос направляется в указанный датасорс.
  • Иначе запрос направляется во все задействованные датасорсы. По возможности система исключает из обработки дублирующиеся датасорсы (реплики).

Маршрутизация запросов к партициям

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

  • Если запрос содержит ключевое слово DATASOURCE_TYPE, запрос направляется в указанный датасорс.
  • Иначе запрос направляется в случайный датасорс из тех, которые содержат данные партиции.