Выбор датасорса для исполнения запроса
Содержание раздела
Раздел описывает, как система выбирает целевой датасорс при чтении и выгрузке данных из логических таблиц, логических и материализованных представлений.
Запросы к standalone-таблицам и прокси-таблицам всегда исполняются в одном датасорсе, так как данные этих таблиц не могут размещаться в нескольких датасорсах.
Выбор датасорса для непартиционированных данных
Датасорс для исполнения запросов на чтение и выгрузку данных из обычных логических таблиц (не участвующих в партиционировании данных), логических и материализованных представлений выбирается так:
- Если в запросе указан датасорс для исполнения запроса с помощью DATASOURCE_TYPE, запрос направляется в него.
- Иначе:
- Определяются датасорсы, в которых можно выполнить запрос, — выбираются датасорсы, содержащие данные всех запрашиваемых логических сущностей.
- Определяется категория запроса.
- Выбирается наиболее оптимальный тип датасорса для исполнения запроса (см. ниже).
- Запрос направляется в случайный датасорс наиболее оптимального типа из тех, которые содержат данные всех сущностей запроса.
О выборе датасорса в запросах к партиционированным таблицам и партициям см. в секциях ниже.
Определение категории запроса
Категории запросов:
- Реляционный (Relational) — содержит
JOIN
и (или) подзапросы. - Аналитический (Analytical) — содержит
GROUP BY
и агрегатные функции. - Чтение по ключу (Dictionary) — содержит условие
WHERE
на первичный ключ. - Другой (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
, запрос направляется в указанный датасорс. - Иначе запрос направляется в случайный датасорс из тех, которые содержат данные партиции.