如何获得postgres中所有字符变化列的max char_length

时间:2017-12-14 17:21:57

标签: postgresql

我想知道一种在postgres数据库中找到变化字符列的上部范围的高效方法。

目前,我正在使用查询来构建一个查询,以此来解决这个问题。

select 
  'select ''' || table_name || ''',''' 
  ||  column_name || '''' || ', max(char_length(' || column_name 
  || ')) from ' || table_name || ' UNION ALL' as query
from information_schema.columns 
where table_schema = 'public'
and data_type in ('character varying','text')
order by table_name ;

表达max(char_length(column_name))的任何信息是否都存在于索引元表中?

1 个答案:

答案 0 :(得分:3)

MVCC并发模型使得服务器准确跟踪这样的聚合统计数据是不切实际的(这就是为什么即使ax.plot()涉及全表扫描)。 pg_stats中有平均宽度,但它基于随机的记录样本,并且不会实时更新。

我建议的唯一潜在优化 - 取决于您计划对此信息执行的操作,和/或您可以对数据做出哪些假设 - 是使用SELECT COUNT(*)而不是octet_length()。这会报告字节数而不是字符数,这可能会或可能不符合您的需要,但它具有直接从记录头读取字节数的优势,而不必扫描每个字符串中的每个字符多字节序列。如果任何值大到足以TOAST,则性能差异将更加明显。 (请注意,如果您使用的是单字节character encoding,则char_length()已执行此优化。)