opengauss分区表列式存储如何按照字段排序

现在字段按照desc,比如时间排序,当数据量有1亿的时候,非常慢,而且页面做分页,点击分页也是非常慢,如何优化,现在是sql上加了/*+ set(query_dop 4 */

列存表不擅长 ORDER BY :数据按 CU(Compression Unit,默认 6 万行/单元)存储,全字段排序需跨 CU 重组;深分页 OFFSET 性能塌方 : 比如OFFSET 100000 LIMIT 20 仍需扫描前 10 万行;仅靠并行作用不大。

  1. 列存表不支持普通 B-tree 加速 ORDER BY,应使用 psort 索引,如:
    – 在时间字段上建 psort 索引(DESC 排序)
    CREATE INDEX idx_time_psort ON 表名 USING psort (时间字段 DESC);
    – 收集统计信息
    ANALYZE 表名;
  2. 避免 OFFSET ,这是分页慢的核心原因。改为基于上一页最后一条记录
    – 游标分页(首页)
    SELECT /*+ set(query_dop 4) */ * FROM 表名
    ORDER BY 时间字段 DESC
    LIMIT 20;

– 后续页(前端传上一页最后一条的时间值)
SELECT /*+ set(query_dop 4) */ * FROM 表名
WHERE 时间字段 < :last_time – 上一页最后一条的时间
ORDER BY 时间字段 DESC
LIMIT 20;

注意:时间字段有重复时需加 tie-breaker,用复合键:
WHERE (时间字段, 主键) < (:last_time, :last_id)
ORDER BY 时间字段 DESC, 主键 DESC
LIMIT 20;