gpt4 book ai didi

sql - 基于 VARCHAR 大小的 Amazon Redshift 查询性能不佳

转载 作者:行者123 更新时间:2023-12-04 22:37:34 27 4
gpt4 key购买 nike

我正在构建 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 column 被定义为能够容纳更大的消息,但实际上它并没有容纳太多数据:消息字段的平均长度是 16 个字符 (std_dev 10)。事件字段的平均长度为 5 个字符 (std_dev 2)。我真正能看到的唯一区别是 VARCHAR 字段的最大长度,但我认为这不会对简单查询返回的时间产生一个数量级的影响!

任何见解将不胜感激。虽然这不是此工具的典型用例(我们将进行聚合,而不是检查单个日志),但我想了解我的表设计的任何微妙或不那么微妙的影响。

谢谢!

戴夫

最佳答案

Redshift 是一个“真正的列式”数据库,只读取查询中指定的列。因此,当您指定 2 个小列时,只需读取那 2 列。但是,当您添加第三个大列时,Redshift 必须做的工作会急剧增加。

这与将整行存储在一起的“行存储”数据库(SQL Server、MySQL、Postgres 等)非常不同。在行存储中,添加/删除查询列对响应时间没有太大影响,因为数据库无论如何都必须读取整行。

最后,您的上一个查询非常快的原因是您已经告诉 Redshift 它可以跳过大部分数据。 Redshift 将您的每一列存储在“块”中,这些块根据您指定的排序键进行排序。 Redshift 会记录每个块的最小值/最大值,并且可以跳过任何不能包含要返回的数据的块。

limit 子句不会减少必须完成的工作,因为您已经告诉 Redshift 它必须首先按 log_timestamp 降序对所有内容进行排序。问题是您的 ORDER BY ... DESC 必须在整个潜在结果集上执行,然后才能返回或丢弃任何数据。当列很小时,它很快,当它们很大时,它很慢。

关于sql - 基于 VARCHAR 大小的 Amazon Redshift 查询性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com