如何对 Redshift View 进行性能测试?
How to performance test Redshift Views?
我对在 redshift 中测试视图的查询性能有疑问。
我有两个 table:table_a 和 table_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:
select count(*) from v_combined where date < "MY_DATE"
select count(*) from table_a where date < "MY_DATE"
select count(*) from v_combined where date > "MY_DATE"
select count(*) from table_b where date > "MY_DATE"
select * from v_combined where date < "MY_DATE" limit 10000
select * from table_a where date < "MY_DATE" limit 10000
select * from v_combined where date > "MY_DATE" limit 10000
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。这样,查询将 运行 快得多。
我对在 redshift 中测试视图的查询性能有疑问。
我有两个 table:table_a 和 table_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:
select count(*) from v_combined where date < "MY_DATE"
select count(*) from table_a where date < "MY_DATE"
select count(*) from v_combined where date > "MY_DATE"
select count(*) from table_b where date > "MY_DATE"
select * from v_combined where date < "MY_DATE" limit 10000
select * from table_a where date < "MY_DATE" limit 10000
select * from v_combined where date > "MY_DATE" limit 10000
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。这样,查询将 运行 快得多。