Выбор датасорса для исполнения запроса
Содержание раздела
При исполнении запроса на чтение или выгрузку данных система выбирает один или несколько датасорсов в порядке, описанном в таблице ниже. Под подходящими (для исполнения запроса к сущности) датасорсами понимаются включенные датасорсы, содержащие данные сущности.
| Характеристика запроса (по убыванию приоритета) | Датасорсы, где исполняется запрос | Основные причины ошибок при выборе датасорсов |
|---|---|---|
| 1. Содержит DATASOURCE_TYPE | Указанный в запросе |
|
| 2. Содержит снапшот-таблицы с set.strict.consistency.enable = true | Первый по алфавиту из подходящих для каждой такой таблицы (если он общий для этих таблиц) |
|
| 3. Содержит партиционированные таблицы | Датасорсы задействованных партиций (с исключением реплик, если возможно) | Выбранные датасорсы партиций содержат данные не всех сущностей запроса |
| 4. [HTTP] Содержит queryId | Вычисленный по queryId* с оптимальным типом из подходящих для всех сущностей запроса | Нет датасорса, подходящего для всех сущностей запроса |
| 5. Остальные случаи | Случайный с оптимальным типом из подходящих для всех сущностей запроса | Нет датасорса, подходящего для всех сущностей запроса |
* Запросы с одинаковым значением queryId при одинаковом списке подходящих датасорсов исполняются в одном и том же датасорсе (если он включен; иначе выбирается другой).
Определение категории запроса
Запросы без DATASOURCE_TYPE, партиционированных таблиц, а также без снапшот-таблиц со строгим уровнем консистентности исполняются в вычисленном или случайном датасорсе с наиболее оптимальным типом, который определяется в зависимости от категории запроса.
Категория запроса определяется так (по убыванию приоритета):
- Содержит
JOINи (или) подзапросы → реляционный. - Содержит
GROUP BYи агрегатные функции → аналитический. - Содержит условие
WHEREна первичный ключ → чтение по ключу. - Остальные случаи → другой.
Запрос относится к категории с наивысшим приоритетом, признаки которой у него есть. Например, запрос с JOIN всегда реляционный, даже если содержит другие признаки.
Примеры запросов по категориям
Реляционные запросы:
-- реляционный запрос без признаков других категорий
SELECT * FROM marketing.sales AS s
JOIN marketing.stores AS st ON s.store_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;
-- аналитический запрос с чтением по ключу
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
Стандартный порядок выбора типа датасорса по категории
Стандартный порядок выбора типа датасорса (см. таблицу ниже) в зависимости от категории запроса учитывает сильные стороны каждого типа и может быть изменен в конфигурации.
Например, для реляционного запроса предпочтение отдается типу ADB, но, если в хранилище нет ADB-датасорсов или в них нет запрашиваемых данных, — типу ADP и далее по таблице.
| Категория запроса | Порядок выбора типа датасорса |
|---|---|
| Реляционный запрос (Relational) | 1. ADB, 2. ADP, 3. ADQM, 4. ADG |
| Аналитический запрос (Analytical) | 1. ADQM, 2. ADB, 3. ADP, 4. ADG |
| Запрос чтения по ключу (Dictionary) | 1. ADG, 2. ADB, 3. ADP, 4. ADQM |
| Другой запрос (Undefined) | 1. ADB, 2. ADP, 3. ADQM, 4. ADG |
Наиболее полный синтаксис запросов доступен в ADB и ADP. ADG и ADQM имеют ограничения на выполнение запросов (см. Поддержка SQL).