SQL优化,关联查询非常慢,前台页面控件卡顿
问题情况:可以看到发起一次8s,sql关联表比较多(历史包袱),其中一个表数据量:1172410
问题分析、原sql:基层数据含union部分,外关联了这张1百万数据表
检查各个表索引都是有的,查询始终都是8s,同样的查询逻辑每次查询都是8s,表象是没走数据库缓存
看着是有缓存的,执行计划太多(SQL文本差异、执行计划变化、子游标问题),这是一个问题
SQL优化:思路,先分页后再进行关联查询,这样不会全扫描大表(注意ROWNUM)
这样执行基本达到1s左右,但是存在分页问题,无法按照排序分页,逻辑是ROW_NUMBER()分页
这里的ROWNUM <= 40
会先随机获取40条记录,然后再对这40条记录排序并分配ROW_NUMBER,这不是正确的分页逻辑。
ROWNUM与ROW_NUMBER()分页的区别
关键区别
-
执行顺序不同:
-
ROWNUM
是在查询结果返回前分配的伪列,它在数据过滤后、排序前就确定了 -
ROW_NUMBER()
是在排序完成后分配的序号
-
所以使用ROW_NUMBER后又多了2s,目前测试差2s区别
还有一种写法:Oracle 12c+的FETCH语法(最简洁高效),可惜不是12的版本
最后改造后sql:退而求其次了只能,一步一步让系统走向高效
不过整体比之前快了一倍,