Маршрутизация запросов к данным
Содержание раздела
Запросы к данным маршрутизируются следующим образом:
- Если в запросе указано ключевое слово DATASOURCE_TYPE с СУБД хранилища для исполнения запроса, запрос направляется в указанную СУБД.
- Иначе:
- Определяются те СУБД хранилища, в которых можно выполнить запрос, — выбираются СУБД, содержащие данные всех запрашиваемых логических сущностей.
- Определяется категория запроса.
- Запрос направляется в ту из выбранных СУБД, которая имеет в конфигурации самый высокий приоритет для запросов этой категории (см. ниже).
Запросы к данным материализованных представлений после перечисленных этапов маршрутизации проходят дополнительные этапы (см. Маршрутизация запросов к данным материализованных представлений).
Порядок выбора СУБД для исполнения каждой категории запросов настраивается в конфигурации системы. По умолчанию действует порядок, описанный в таблице ниже. Такой порядок выбора СУБД эффективно использует возможности каждой из СУБД хранилища, однако при необходимости его можно изменить.
Категория запроса | Порядок выбора СУБД для исполнения запроса |
---|---|
1. Реляционный запрос (запрос с ключевым словом JOIN и (или) подзапросами) | 1. ADB 2. ADQM 3. ADG |
2. Запрос агрегации и группировки | 1. ADQM 2. ADB 3. ADG |
3. Запрос точечного чтения по ключу | 1. ADG 2. ADB 3. ADQM |
4. Другой запрос (не соответствующий ни одной из предыдущих категорий) | 1. ADB 2. ADQM 3. ADG |
Категория запроса определяется в указанном порядке: запрос проверяется на наличие признаков первой категории, и затем, если запрос не соответствует первой категории, он проверяется на наличие признаков второй категории и т.д. Например, запрос с ключевым словом 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
Маршрутизация запросов к данным материализованных представлений
Запросы к данным материализованных представлений проходят все этапы маршрутизации, описанные выше, и затем — дополнительные этапы:
- Если для материализованного представления не указано ключевое слово
FOR SYSTEM_TIME
, запрос направляется в СУБД, где размещены данные этого представления. Из представления выбираются данные, актуальные на момент его последней синхронизации. - Иначе, если ключевое слово
FOR SYSTEM_TIME
указано, система проверяет, присутствуют ли запрашиваемые данные в материализованном представлении.- Если данные присутствуют в представлении, запрос направляется в СУБД, где размещены данные этого представления.
- Иначе запрос направляется к исходным таблицам СУБД-источника, на которых построено представление.
Примечание: следующие ключевые слова не поддерживаются в запросах к материализованным представлениям:
FOR SYSTEM_TIME AS OF LATEST_UNCOMMITTED_DELTA
;FOR SYSTEM_TIME AS OF STARTED IN (delta_num1, delta_num2)
, если хотя бы одна дельта из диапазона отсутствует в материализованном представлении;FOR SYSTEM_TIME AS OF FINISHED IN (delta_num1, delta_num2)
, если хотя бы одна дельта из диапазона отсутствует в материализованном представлении.