【问题标题】:Redshift performance for simple time series data简单时间序列数据的 Redshift 性能
【发布时间】:2018-08-29 15:30:07
【问题描述】:

我正在使用 AWS Redshift 表,其中包含有关函数调用的信息。 每行都有一个日期(时间戳类型)、一个 UID(varchar)和几个字段,例如持续时间、错误代码。 表的大小约为 2500 万行,包含约 1000 个不同的函数(每个函数都有不同的 UID)。

我的问题是,简单的查询作为时间窗口中几个函数的调用计数需要很长时间 - 通常是 5-30 秒。

我尝试过排序键和 dist 键的不同组合,但性能似乎仍然非常相似:

  • 设置函数UID为dist key

  • 以任意顺序设置日期、函数 UID 和两者的组合的复合排序键。

我在桌子上运行了 VACUUM 和 ANALYZE。 我还尝试添加/删除列压缩。

我只使用一个 dc2.large 节点。

编辑:

表 DDL 为:

create table public."invocations_metrics_$mig"(
"function_uid" varchar(256)  NOT NULL encode RAW DISTKEY
,"date" timestamp    encode zstd 
,"duration" double precision   encode zstd 
,"used_memory" integer   encode zstd 
,"error" smallint   encode zstd 
,"has_early_exit" boolean   encode zstd 
,"request_id" varchar(256)   encode zstd 
)
 SORTKEY(date,function_uid);

一行示例:

"aca500c9-27cc-47f8-a98f-ef71cbc7c0ef","2018-08-15 13:43:28.718",0.17,27,0,false,"30ee84e1-a091-11e8-ba47-b110721c41bc"

查询:

SELECT
    count(invocations_metrics_backup.function_uid) AS invocations,
    max(invocations_metrics_backup.date) AS last_invocation,
    invocations_metrics_backup.function_uid AS uid
FROM
    invocations_metrics_backup
WHERE
    function_uid IN (
        <10 UIDs>
    )
    AND DATE >= '2018-08-20T10:55:20.222812'::TIMESTAMP
GROUP BY
    function_uid

总时间为 5 秒。每个查询中的计数约为 5000。 对于具有约 1M 计数的相同查询,它需要 30 秒。

【问题讨论】:

  • 请显示一些示例数据和您正在使用的确切 sql。连同表格的 ddl。也是该查询的确切时间(第二次运行 - 不是第一次)
  • 已编辑。我已经为示例禁用了会话缓存(否则第二个查询非常快)。谢谢!
  • 您的 dist 键可能会导致问题。尝试使用“diststyle even”并且没有排序键并发布时间。
  • 提高了大约 20%。这很好,但我认为这个查询应该减少 90% 的时间。

标签: amazon-web-services amazon-redshift


【解决方案1】:

首先,您需要使用至少 2 个节点。单个节点必须承担作为领导者和计算者的双重职责。如果有 2 个或更多节点,您将获得一个免费的领导节点。

然后,如下更改您的 DDL,删除排序键上的压缩:

CREATE TABLE public."invocations_metrics_$mig" (
    "function_uid"   varchar(256) NOT NULL ENCODE ZSTD,
    "date"           timestamp             ENCODE RAW,
    "duration"       double precision      ENCODE ZSTD,
    "used_memory"    integer               ENCODE ZSTD,
    "error"          smallint              ENCODE ZSTD,
    "has_early_exit" boolean               ENCODE ZSTD,
    "request_id"     varchar(256)          ENCODE ZSTD
) 
DISTSTYLE KEY 
DISTKEY( function_uid )
SORTKEY ( date )
;

您还可以通过将唯一 UID 映射到整数 ID 值并在查询中使用它来提高性能。 UID 值的使用效率非常低。这些值随机出现并且相对较宽且熵非常高。它们在排序、散列聚合和散列连接期间很昂贵。

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多