如何对 Redshift View 进行性能测试?

How to performance test Redshift Views?

我对在 redshift 中测试视图的查询性能有疑问。

我有两个 table:table_atable_b: - table a 和 table b 定义了不同的排序键。 - table a 有 6 个字段作为排序键。 - table b 有 4 个字段用于排序键。 - table 共享一些列 names/types 但 table a 是 table b.

的超集

我创建了一个视图 v_combined。该视图根据查询的日期合并来自 table a 和 table b 的数据。例如,如果在日期 XYZ 之前进行查询,则视图将来源 table a。否则它来源 table b.

create view as v_combined
select a as x, b as y, c as z, to_timestamp(time_field::TEXT, 'YYYYMMDD'):timestamp as date
from table_a
where date < "MY_DATE"

union all

select * from table_b
where date > "MY_DATE"

我做了一个视图和对应的比较table:

  1. select count(*) from v_combined where date < "MY_DATE"
  2. select count(*) from table_a where date < "MY_DATE"
  3. select count(*) from v_combined where date > "MY_DATE"
  4. select count(*) from table_b where date > "MY_DATE"
  5. select * from v_combined where date < "MY_DATE" limit 10000
  6. select * from table_a where date < "MY_DATE" limit 10000
  7. select * from v_combined where date > "MY_DATE" limit 10000
  8. select * from table_b where date > "MY_DATE" limit 10000

(1) 和 (2) 的执行时间与预期相似。

(3) 和 (4) 的执行时间与预期相似。

(5) 的执行时间似乎比 (6) 长。

(7) 的执行时间似乎比 (8) 长。

在 redshift 中测试视图性能的最佳方法是什么?

我想说测试视图性能的最佳方法是 运行 完全像您一样测试查询!

这个特定视图的性能总是很差,因为它正在做 UNION ALL

在 (5) 中,它需要在应用 LIMIT 之前从两个 table 获取所有行,而 (6) 只需要访问 table_a 并且可以停止一旦达到上限。

如果您需要像这样的查询获得良好的性能,您可以考虑创建一个组合 table(而不是视图)。 运行 每日(或每小时?)脚本,用于从组合数据中重新创建 table。这样,查询将 运行 快得多。