代码之家  ›  专栏  ›  技术社区  ›  Ronyis

简单时间序列数据的红移性能

  •  1
  • Ronyis  · 技术社区  · 8 年前

    表的大小约为2500万行,包含1000个不同的函数(每个函数具有不同的UID)。

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

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

    • 将功能UID设置为dist键

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

    我还尝试添加/删除列压缩。

    我只使用一个dc2。大型节点。

    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
    

    对于同一个计数为1M的查询,需要30秒。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Joe Harris    8 年前

    首先,您需要使用至少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 )
    ;
    

    推荐文章