暂无图片
多表关联查询分页优化问
我来答
分享
左磊
2021-10-14
多表关联查询分页优化问


这个分页执行需要7-9秒,希望能做到秒出,请大家指点一下

select *
from (select tmp_page.*, rownum row_id
from (SELECT /*+ use_nl(T2,T3) use_nl(T2,T) index_combine(T3 BA_USER_INFO_T_N2 BA_USER_INFO_T_N6)*/
T.MEMBER_ID,
T.LABEL_ID,
T2.MEMBER_NAME,
T2.MEMBER_NO,
T3.OPEN_ID
FROM BIZCRMDB.CUX_LABELS_MEM T,
BASEDB.BA_MEMBER_INFO_T T2,
BASEDB.BA_USER_INFO_T T3
WHERE T.MEMBER_ID = T2.MEMBER_ID
AND T2.MEMBER_ID = T3.MEMBER_ID
AND T3.OPEN_ID is not null
AND T.LABEL_ID = 72) tmp_page
where rownum <= 150100)
where row_id > 150000

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
chengang

1、分页方式写法不好。太多了子查询

    比如最外层完全没有必要。 where rownum >150000 and rownum <=150100

    而且还可以放里层放。

2、如果T,T2,T3都是大表的话。 由于查询和条件的字段不多。我会对三个表建立联合索引。完成索引覆盖

3、如果T2表的关联是 1对1的。不会引起记录增大的话。就改为先取到100条记录后 再用这100条记录去关联T2再取T2表的字段。 

   

暂无图片 评论
暂无图片 有用 1
打赏 0
左磊


这个分页是根据罗炳森老师书中提到的方式分页的。T,T2,T3是大表,T2.MEMBER_ID上有唯一索引,跟其他表是一对多的关系

暂无图片 评论
暂无图片 有用 0
打赏 0
chengang

首先,那2,3点你可以做改善。

其次。我还是不认可这个分页框架。在小的分页数下可能没有问题。在数据量大的情况下,很明显那个rn >xx 应该带入到里面去。我没有明白,这里多嵌套一层的意义。

暂无图片 评论
暂无图片 有用 0
打赏 0
DarkAthena
2021-10-14
如果先限定行数,那么可能不会走索引,因为扫描前几行会更快。所以他先把数据全部查出来,再分页。实际上,嵌套式的sql,oracle有时候会自作主张的把外围的条件穿透进内层去,他搞个2层嵌套是以为CBO只能穿一层条件吧。但不管怎么说,不加强制hint,就算是同样的sql同样的数据量,每次的执行计划也有可能不一样,用这种耍小聪明的方法不一定适用于所有场景,还是得自己在实际场景中多试下各种组合
回答交流
Markdown


请输入正文
提交
相关推荐
SQL执行很慢, CPU不高、内存不高、IO不高, SQL比较复杂,有没有什么办法和核查和优化?
回答 1
贴计划
求推荐数据库查询SQL进阶的书? 对sql理解和运用都很浅,想进阶一下,复杂一点的sql没有思路只能百度了
回答 2
您好:《SQL必知必会》和《SQL基础教程》,前者入门、后者适合有基础前提阅读。参考:Mysql入门学习步骤建议
为什么Navicat工具这么贵,还有人用?
回答 8
mark
在postgresql12中,SQL单独执行不慢,但在存储过程中执行慢。
回答 1
1.启用慢查询日志,修改postgresql.conf文件,logmindurationstatement5000记录执行时间超过5秒的查询2.分析执行计划EXPLAINANALYZESELECTFR
SQL数据库连表查询如何将左表中的某一个字段覆盖右表?
回答 1
已采纳
更新还是查询?查询的话。比如根据条件覆盖select&nbsp;case&nbsp;whenABthen&nbsp;lefttable.field&nbsp;elserighttable.fieldf
繁体操作系统装简体的sql有影响吗?
回答 3
sql语句不都是英文的吗
我做了一些测试(表空间的备份还原),但没有成功恢复
回答 1
已采纳
DM8数据库??DM8表空间的恢复会自动应用归档恢复到最新状态。drop表不能使用表空间恢复,应使用库的不完全恢复,恢复到删除前的指定时间点。
pgsql在命令中导入sql没有任何提示表示导入成功吗?
回答 1
没有
假设有考勤表,请教如何通过sql查询只有签到没有签退的记录?
回答 4
selecttrunc(time)dt,usernamefrom考勤表wheretime&gt;&amp;begintimeandtime&lt;&amp;endtimegroupbyusername
一个 sql 数据库, select 正常, update ,即使我只 update 一个字段, 字符型 或 日期这些都不行
回答 4
哪里不行?
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~