【发布时间】:2014-08-10 06:53:44
【问题描述】:
我正在构建一个 Amazon Redshift 数据仓库,并且遇到了基于 VARCHAR 列的定义大小的意外性能影响。详情如下。我的三个专栏来自 pg_table_def:
schemaname | tablename | column | type | encoding | distkey | sortkey | notnull
------------+-----------+-----------------+-----------------------------+-----------+---------+---------+---------
public | logs | log_timestamp | timestamp without time zone | delta32k | f | 1 | t
public | logs | event | character varying(256) | lzo | f | 0 | f
public | logs | message | character varying(65535) | lzo | f | 0 | f
我最近运行了 Vacuum 和 Analyze,我在数据库中有大约 1 亿行,我看到的性能非常不同,具体取决于我包含的列。
查询 1: 例如,以下查询大约需要 3 秒:
select log_timestamp from logs order by log_timestamp desc limit 5;
查询 2: 要求更多数据的类似查询在 8 秒内运行:
select log_timestamp, event from logs order by log_timestamp desc limit 5;
查询 3: 但是,这个查询与前面的非常相似,需要 8 分钟才能运行!
select log_timestamp, message from logs order by log_timestamp desc limit 5;
查询 4: 最后,这个查询与慢查询相同,但有明确的范围限制,非常快(~3s):
select log_timestamp, message from logs where log_timestamp > '2014-06-18' order by log_timestamp desc limit 5;
message 列被定义为能够容纳更大的消息,但实际上它并没有容纳太多数据:消息字段的平均长度为 16 个字符(std_dev 10)。事件字段的平均长度为 5 个字符(std_dev 2)。我真正能看到的唯一区别是 VARCHAR 字段的最大长度,但我认为这不会对简单查询返回的时间产生一个数量级的影响!
任何见解将不胜感激。虽然这不是这个工具的典型用例(我们将汇总远远超过我们将检查单个日志),但我想了解我的表格设计的任何微妙或不那么微妙的影响。
谢谢!
戴夫
【问题讨论】:
-
您是否尝试过多次运行查询? Redshift 似乎将列缓存在内存中,因此对列的第一次引用可能比后续引用要慢。
-
是的,我重新运行了这些查询,引用的性能时间似乎可靠且可重复。
标签: sql amazon-redshift