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