使用分解数据创建 Amazon Redshift 标量列
了解存储到 SUPER 中的无 schema 数据会影响 Amazon Redshift 的性能。例如,筛选条件谓词或联接条件作为范围限制扫描无法有效地使用区域映射。用户和 BI 工具可以使用实体化视图作为数据的传统表示形式,并提高分析查询的性能。
以下查询扫描实体化视图 super_mv
并筛选 o_orderstatus
。
SELECT c.c_name, v.o_totalprice FROM customer_orders_lineitem c JOIN super_mv v ON c.c_custkey = v.c_custkey WHERE v.o_orderstatus = 'F';
检查 stl_scan
以验证 Amazon Redshift 无法通过 o_orderstatus
在范围限制扫描中有效地使用区域映射。
SELECT slice, is_rrscan FROM stl_scan WHERE query = pg_last_query_id() AND perm_table_name LIKE '%super_mv%'; slice | is_rrscan -------+----------- 0 | f 1 | f 5 | f 4 | f 2 | f 3 | f (6 rows)
以下示例调整实体化视图 super_mv
以从分解的数据中创建标量列。在这种情况下,Amazon Redshift 会将 o_orderstatus
从 SUPER 转换为 VARCHAR。此外,指定 o_orderstatus
作为 super_mv
的排序键。
CREATE MATERIALIZED VIEW super_mv distkey(c_custkey) sortkey(c_custkey, o_orderstatus) AS ( SELECT c_custkey, o.o_orderstatus::VARCHAR AS o_orderstatus, o.o_totalprice, o_idx FROM customer_orders_lineitem c, c.c_orders o AT o_idx );
重新运行查询后,验证 Amazon Redshift 现在可以使用区域映射。
SELECT v.o_totalprice FROM super_mv v WHERE v.o_orderstatus = 'F';
您可以验证范围限制扫描现在是否使用区域映射,如下所示。
SELECT slice, is_rrscan FROM stl_scan WHERE query = pg_last_query_id() AND perm_table_name LIKE '%super_mv%'; slice | is_rrscan -------+----------- 0 | t 1 | t 2 | t 3 | t 4 | t 5 | t (6 rows)