最近在优化一个复杂查询时遇到了性能瓶颈,想请教一下大家的优化经验。
查询场景:
· 表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
· 内存使用较高
已尝试优化:
- 为order_time、status、product_id创建了复合索引
- 调整了ob_sql_work_area_percentage参数
- 尝试使用Hint指定不同的JOIN算法
具体问题:
- 这种规模的数据量,45秒的响应是否正常?
- 除了索引优化,OB还有哪些针对JOIN查询的特别优化手段?
- 是否有必要考虑分区表设计?
希望有实际优化经验的同学能指点一二,感谢!