Маршрутизация запросов к данных
Запросы к данным маршрутизируются следующим образом:
- если в запросе указана СУБД хранилища (см. DATASOURCE_TYPE), в которой должен быть выполнен запрос, запрос направляется в указанную СУБД;
- иначе запрос маршрутизируется автоматически на основе его категории в соответствии с конфигурацией системы.
По умолчанию в конфигурации определен следующий порядок выбора СУБД для исполнения запросов:
- реляционные запросы — запросы с операторами JOIN и (или) подзапросами — направляются в ADB;
- запросы агрегации и группировки данных направляются в ADQM;
- запросы точечного чтения по ключу направляются в ADG;
- запросы, не соответствующие ни одной из предыдущих категорий, направляются в ADB.
Категория запроса определяется в указанном выше порядке. Например, если запрос содержит оператор JOIN, то он попадает в первую категорию независимо от наличия агрегации, группировки и чтения по ключу. Примеры запросов каждой из категорий см. ниже.
Указанный порядок выбора СУБД эффективно использует возможности каждой из СУБД хранилища, однако при необходимости его можно изменить в конфигурации системы.
Примечание: наиболее полный синтаксис запросов доступен в ADB. ADG и ADQM имеют ограничения на выполнение запросов, вызванные особенностями этих СУБД (см. Поддержка SQL).
Примеры запросов различных категорий
Реляционный запрос:
SELECT * FROM sales.sales AS s
JOIN sales.stores AS st
ON s.store_id = st.identification_number
Реляционный запрос с агрегацией, группировкой и чтением по ключу (st.identification_number
):
SELECT
st.identification_number,
st.category,
SUM(s.product_units) AS product_amount
FROM sales.stores AS st
JOIN sales.sales AS s
ON st.identification_number = s.store_id
WHERE st.identification_number <> 10004
GROUP BY st.identification_number, st.category
ORDER BY product_amount DESC
Запрос агрегации и группировки:
SELECT s.product_code, SUM(s.product_units) AS product_amount
FROM sales.sales AS s
GROUP BY s.product_code
ORDER BY product_amount ASC
Запрос агрегации и группировки с чтением по ключу (s.identification_number
):
SELECT s.product_code, SUM(s.product_units) AS product_amount
FROM sales.sales AS s
WHERE s.identification_number > 20000
GROUP BY s.product_code
Запрос чтения по ключу:
SELECT * FROM sales.sales as s
WHERE s.identification_number BETWEEN 1001 AND 2000
Запрос неопределенной категории:
SELECT *
FROM sales.sales AS s
WHERE s.product_units > 2