Как добиться лучших результатов при использовании UNION SELECT и фильтров в БД HANA - PullRequest
0 голосов
/ 25 декабря 2018

Выполняет ли оптимизация HANA DB запрос, когда я объявляю условие WHERE?Например, я хотел бы знать, где я могу получить лучшую производительность или если оба параметра одинаковы:

Если условие WHERE одинаково, должно ли оно быть в каждом UNION SELECT или я могу использовать его вконец запроса?

Вариант 1:

SELECT DATA.TABLE_NAME, DATA.DATE FROM (
SELECT
    'TABLE1' AS TABLE_NAME,
    DATE
    FROM "SCHEMA"."TABLE1" TABLE1
    WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION SELECT
    'TABLE2' AS TABLE_NAME,
    DATE
    FROM "SCHEMA"."TABLE2" TABLE2
    WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION SELECT
    'TABLE3' AS TABLE_NAME,
    DATE
    FROM "SCHEMA"."TABLE3" TABLE3
    WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
) DATA
WHERE DATA.DATE >= '2018-12-01' AND DATA.DATE <= '2018-12-31'

Оптимизирует ли база данных запрос с условиями где, или я должен упомянуть условие where для каждого SELECT?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Чтобы ответить на вопрос: Да, SAP HANA оптимизирует запрос и попытается по возможности оттолкнуть внешнее условие WHERE.

Самый простой способ проверить это - использовать EXPLAIN PLAN и проверить,фильтры были применены до или после обработки UNION.

0 голосов
/ 25 декабря 2018

Если в ваших таблицах нет дубликатов, вы можете использовать UNION ALL.Подзапрос также не нужен:

SELECT 'TABLE1' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE1" TABLE1
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION ALL
SELECT 'TABLE2' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE2" TABLE2
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION ALL
SELECT 'TABLE3' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE3" TABLE3
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31';

UNION накладные расходы на удаление дубликатов.У вас нет дубликатов между таблицами из-за первого столбца, поэтому используйте вместо него UNION ALL.

Если в ваших таблицах есть дубликаты, добавьте индекс для DATE для каждой из них.и используйте SELECT DISTINCT с UNION ALL:

SELECT DISTINCT 'TABLE1' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE1" TABLE1
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION ALL
SELECT DISTINCT 'TABLE2' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE2" TABLE2
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31'
UNION ALL
SELECT DISTINCT 'TABLE3' AS TABLE_NAME, DATE
FROM "SCHEMA"."TABLE3" TABLE3
WHERE DATE >= '2018-12-01' AND DATE <= '2018-12-31';

Индекс будет использоваться для SELECT DISTINCT, и вам не придется нести накладные расходы на удаление несуществующих дубликатов между таблицами.

...