Выбор датасорса для исполнения запроса

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

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

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

Выбор датасорса для непартиционированных данных

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

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

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

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

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

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

Система определяет категорию запроса по приоритету от реляционной к другой: запросы с признаками реляционного запроса считаются реляционными, остальные запросы проверяется на наличие признаков следующей категории и т.д. Например, запрос с JOIN всегда считается реляционным, даже если в нем есть признаки других категорий.

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

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

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

Например, реляционный запрос по возможности исполняется в 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, запрос направляется в указанный датасорс.
  • Иначе запрос направляется в случайный датасорс из тех, которые содержат данные партиции.