微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果按 pk 和限制顺序选择不同的 pk,则不要聚合整个列

如何解决如果按 pk 和限制顺序选择不同的 pk,则不要聚合整个列

我有一个 clickhouse 表 events 包含 5000 万行的一年时间(可能重复)


    create table events (
        event LowCardinality(String),event_time DateTime64(3),uid       String
    ) engine=ReplacingMergeTree() toYYYYMM(event_time)
        primary key (event,event_time)
        order by (event,event_time,uid)

当我尝试选择前 500 行时,clickhouse 会处理所有这些行 (50M)

    select distinct event,event_time 
    from events 
    where event='some_event' and event_time between '2020-02-24 00:00:00.000' AND '2021-02-24 00:00:00.000' 
    order by(event,event_time) desc limit 500

所以它基本上按事件分组,event_time 50M 行,然后对它们应用限制。是否可以强制 clickhouse 不读取整个时间段的数据?

解决方法

CREATE TABLE events
(
    `event` LowCardinality(String),`event_time` DateTime,`uid` String
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(event_time)
ORDER BY (event,event_time,uid);


INSERT INTO events SELECT
    'ev',toDateTime('2020-01-01 00:00:00') + toIntervalSecond(number),randomPrintableASCII(5)
FROM numbers(30000000);
    
    
SELECT *
FROM
(
    SELECT event_time
    FROM events
    WHERE (event = 'ev') AND ((event_time >= '2020-01-01 00:00:00') AND (event_time <= '2021-01-01 00:00:00'))
    ORDER BY
        event DESC,event_time DESC
    LIMIT 1 BY event_time
)
LIMIT 500
.....

Elapsed: 0.008 sec. Processed 1.07 million rows

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。