Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

分析表设计

如之前部分所述,指定排序键、分配键和列编码可极大改善存储、I/O 和查询性能。本部分提供了一个 SQL 脚本,供您运行以帮助确定缺少这些选项或性能较差的表。

复制并粘贴下面的代码以创建名为 table_inspector.sql 的 SQL 脚本,然后以超级用户身份在您的 SQL 客户端应用程序中执行该脚本。

Copy
SELECT SCHEMA schemaname, "table" tablename, table_id tableid, size size_in_mb, CASE WHEN diststyle NOT IN ('EVEN','ALL') THEN 1 ELSE 0 END has_dist_key, CASE WHEN sortkey1 IS NOT NULL THEN 1 ELSE 0 END has_sort_key, CASE WHEN encoded = 'Y' THEN 1 ELSE 0 END has_col_encoding, CAST(max_blocks_per_slice - min_blocks_per_slice AS FLOAT) / GREATEST(NVL (min_blocks_per_slice,0)::int,1) ratio_skew_across_slices, CAST(100*dist_slice AS FLOAT) /(SELECT COUNT(DISTINCT slice) FROM stv_slices) pct_slices_populated FROM svv_table_info ti JOIN (SELECT tbl, MIN(c) min_blocks_per_slice, MAX(c) max_blocks_per_slice, COUNT(DISTINCT slice) dist_slice FROM (SELECT b.tbl, b.slice, COUNT(*) AS c FROM STV_BLOCKLIST b GROUP BY b.tbl, b.slice) WHERE tbl IN (SELECT table_id FROM svv_table_info) GROUP BY tbl) iq ON iq.tbl = ti.table_id;

下面的示例显示了针对两个示例表 SKEW1 和 SKEW2 运行该脚本的结果,从而演示了数据偏斜的影响。

Copy
| | | |has_ |has_ |has_ |ratio_skew|pct_ | | |size_|dist_ |sort_|col_ |_across_ |slices_ schemaname|tablename|tableid|in_mb|key |key |encoding|slices |populated ----------+---------+-------+-----+------+-----+--------+----------+--------- public |category |100553 | 28 | 1 | 1 | 0 | 0 | 100 public |date |100555 | 44 | 1 | 1 | 0 | 0 | 100 public |event |100558 | 36 | 1 | 1 | 1 | 0 | 100 public |listing |100560 | 44 | 1 | 1 | 1 | 0 | 100 public |nation |100563 | 175 | 0 | 0 | 0 | 0 | 39.06 public |region |100566 | 30 | 0 | 0 | 0 | 0 | 7.81 public |sales |100562 | 52 | 1 | 1 | 0 | 0 | 100 public |skew1 |100547 |18978| 0 | 0 | 0 | .15 | 50 public |skew2 |100548 | 353 | 1 | 0 | 0 | 0 | 1.56 public |venue |100551 | 32 | 1 | 1 | 0 | 0 | 100 public |users |100549 | 82 | 1 | 1 | 1 | 0 | 100 public |venue |100551 | 32 | 1 | 1 | 0 | 0 | 100

下面的列表介绍了 TEMP_TABLES_REPORT 列:

has_dist_key

指示该表有没有分配键。1 表示存在键;0 表示不存在键。例如,nation 没有分配键。

has_sort_key

指示该表有没有排序键。1 表示存在键;0 表示不存在键。例如,nation 没有排序键。

has_column_encoding

指示该表是否已为任意列定义任何压缩编码。1 表示至少有一列采用了某种编码。0 表示没有采用任何编码。例如,region 没有采用压缩编码。

ratio_skew_across_slices

数据分配偏斜的指示。值越小越好。

pct_slices_populated

切片的填充百分比。值越大越好。

有明显数据分配偏斜的表要么在 ratio_skew_across_slices 列中包含有大值,要么在 pct_slices_populated 列中包含有小值。这表示您未选择合适的分配键列。在上面的示例中,SKEW1 表在所有切片中拥有 15% 的偏斜率,但这不一定就是问题。更值得注意的是,SKEW2 表的填充切片值为 1.56%。该值较小表明 SKEW2 表的分配键有误。

每当您向数据库中添加新表或对表做出重大修改时,请运行 table_inspector.sql 脚本。