sql优化记录一
业务背景
列出每个活动的参与人数,从Oracle中查询
- 表A 活动表,内含活动ID、活动信息。
- 表B 客户活动明细表,记录客户参与的活动明细。
其中:
- 表A为小表,记录数为2W
- 表B为大表,记录数为2000W
原情况
关联查询,进行Count,查询需36秒,超出网关超时时间30秒。
改进尝试
子查询,多次的单表查询。
- 子查询有提升,仍较慢
- 多次查询,由应用在B表中查出所有的活动ID,使用IN在B表中Count。其中第二步查询需2.5秒。
小改进
在第二步查询中,有在sql中拼字符串的操作,转为在java中进行,查询耗时降低至1.9秒。
再改进
分页查询
异步使用单个活动ID查询,一次Count单个活动所需时长为0.5秒。
终极但目前还没必要
利用redis缓存,每次更新大表B时,更新Redis中活动的人数。不过暂时还没这样的需求。
总结
连表查询对数据库消耗巨大,性能与单表查询无法比较。让应用进行单表查询往往能解决很多问题。