在 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 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
,并且您不会产生开销来删除表之间不存在的重复项。
回答问题:是的,SAP HANA 优化了查询,如果可能,将尝试下推外部 WHERE 条件。
最简单的检查方法是使用 EXPLAIN PLAN
并检查是否在处理 UNION 之前或之后应用了过滤器。
当我声明 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 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
,并且您不会产生开销来删除表之间不存在的重复项。
回答问题:是的,SAP HANA 优化了查询,如果可能,将尝试下推外部 WHERE 条件。
最简单的检查方法是使用 EXPLAIN PLAN
并检查是否在处理 UNION 之前或之后应用了过滤器。