现在字段按照desc,比如时间排序,当数据量有1亿的时候,非常慢,而且页面做分页,点击分页也是非常慢,如何优化,现在是sql上加了/*+ set(query_dop 4 */
列存表不擅长 ORDER BY :数据按 CU(Compression Unit,默认 6 万行/单元)存储,全字段排序需跨 CU 重组;深分页 OFFSET 性能塌方 : 比如OFFSET 100000 LIMIT 20 仍需扫描前 10 万行;仅靠并行作用不大。
- 列存表不支持普通 B-tree 加速 ORDER BY,应使用 psort 索引,如:
– 在时间字段上建 psort 索引(DESC 排序)
CREATE INDEX idx_time_psort ON 表名 USING psort (时间字段 DESC);
– 收集统计信息
ANALYZE 表名; - 避免 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;