OB 4.x版本大表JOIN查询性能优化思路 各位技术大佬好

最近在优化一个复杂查询时遇到了性能瓶颈,想请教一下大家的优化经验。

查询场景:

· 表A:约5000万行,主要存储用户订单信息
· 表B:约3000万行,存储商品信息
· 需要关联查询近3个月的订单及其商品详情

当前SQL:

SELECT /*+ PARALLEL(8) */ 
    a.order_id, a.user_id, a.order_time,
    b.product_name, b.category, b.price
FROM order_table a
JOIN product_table b ON a.product_id = b.product_id
WHERE a.order_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)
    AND a.status = 'COMPLETED'
ORDER BY a.order_time DESC
LIMIT 10000;

执行情况:

· 当前执行时间:约45秒
· 执行计划显示全表扫描+Hash Join
· 内存使用较高

已尝试优化:

  1. 为order_time、status、product_id创建了复合索引
  2. 调整了ob_sql_work_area_percentage参数
  3. 尝试使用Hint指定不同的JOIN算法

具体问题:

  1. 这种规模的数据量,45秒的响应是否正常?
  2. 除了索引优化,OB还有哪些针对JOIN查询的特别优化手段?
  3. 是否有必要考虑分区表设计?

希望有实际优化经验的同学能指点一二,感谢!

2 个赞

45s有点慢了。建议对 order_table 按时间做 RANGE 分区,调整索引设置
CREATE INDEX idx_order_status_time ON order_table(status, order_time, product_id);

厉害

product_id 这个字段的过滤性怎么样?如果过滤性很高可以试试/*+ ordered use_nl(b) */ 走流式看看性能,当然需要加索引 order_table(status, order_time, product_id)

对我帮助很大,已经解决了我问题,谢谢分享