如何从catalog表查询SORTKEY定义及解决svv_table_info使用报错
Redshift SORTKEY配置获取解决方案
方案1:直接查询底层系统catalog获取完整SORTKEY配置
SORTKEY的模式配置存储在pg_class系统表的reloptions数组字段中,结合pg_attribute的attsortkeyord字段即可完整判断配置类型,无需依赖svv_table_info:
reloptions中存在auto_sortkey=all→ 对应SORTKEY AUTO(ALL)reloptions中存在auto_sortkey=even→ 对应SORTKEY AUTO(EVEN)- 无
auto_sortkey参数且存在attsortkeyord>0的列 → 手动指定排序键模式,按attsortkeyord顺序拼接列名即可
可直接用于自定义视图的参考查询如下:
WITH sortkey_base_config AS ( SELECT c.oid AS table_oid, n.nspname AS schema_name, c.relname AS table_name, CASE WHEN EXISTS (SELECT 1 FROM unnest(c.reloptions) opt WHERE opt = 'auto_sortkey=all') THEN 'AUTO(ALL)' WHEN EXISTS (SELECT 1 FROM unnest(c.reloptions) opt WHERE opt = 'auto_sortkey=even') THEN 'AUTO(EVEN)' ELSE 'MANUAL' END AS sortkey_type FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind = 'r' -- 过滤普通业务表,排除视图、系统表等 ) SELECT s.schema_name, s.table_name, CASE WHEN s.sortkey_type != 'MANUAL' THEN 'SORTKEY ' || s.sortkey_type ELSE 'SORTKEY(' || string_agg(a.attname, ',' ORDER BY a.attsortkeyord) || ')' END AS full_sortkey_definition FROM sortkey_base_config s LEFT JOIN pg_catalog.pg_attribute a ON a.attrelid = s.table_oid AND a.attsortkeyord > 0 AND a.attisdropped = false GROUP BY s.schema_name, s.table_name, s.sortkey_type;
该查询所有调用的函数均为Redshift支持在视图定义中使用的标准函数,不会触发函数不支持报错。
方案2:解决svv_table_info调用函数报错的问题
该报错是Redshift对系统视图的上下文调用限制导致的,可通过中转层规避:
- 单次使用场景:先将
svv_table_info结果写入临时表,再对临时表调用处理函数即可CREATE TEMP TABLE temp_table_info AS SELECT * FROM svv_table_info; -- 后续对temp_table_info使用text、format_type等函数无限制 - 长期使用场景:创建定期刷新的物化视图存储
svv_table_info的结果,自定义视图直接读取该物化视图即可。
内容的提问来源于stack exchange,提问作者hemant A
相关产品推荐
相关产品推荐

