在 HANA DB 上使用 UNION SELECT 和过滤器时如何获得更好的性能

How to get better performances when using UNION SELECT and filters on HANA DB

当我声明 WHERE 条件时,HANA DB 是否会对查询进行优化? 例如,我想知道在哪里可以获得更好的性能或者两个选项是否相同:

如果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 上提及 where 条件?

假设您的表没有重复项,您可以使用 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 会产生删除重复项的开销。由于第一列,您在 between 表中没有重复项,因此请改用 UNION ALL

如果您的表确实有重复项,则在 DATE 上为每个表添加索引,并使用 SELECT DISTINCTUNION 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,并且您不会产生开销来删除表之间不存在的重复项。

回答问题:是的,SAP HANA 优化了查询,如果可能,将尝试下推外部 WHERE 条件。

最简单的检查方法是使用 EXPLAIN PLAN 并检查是否在处理 UNION 之前或之后应用了过滤器。