sql学习 项目中的表连接优化分享.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
SQL学习项目中的表连接优化分享 在 SQL 项目中,表连接优化是非常重要的一方面。以下是三个来自不同应用的经典 SQL 问题,都是来自集团应用、安徽应用、浙江应用,但它们都有一个共同的特点,就是表连接的优化。 子查询与表连接优化 在 SQL 编写中,许多开发人员喜欢使用复杂的子查询来解决问题,但是这种做法往往会带来性能问题和结果值不对的问题。例如,在 ITSM 集团项目中的一条 SQL 语句中,我们可以看到以下的写法: ```sql select ta.tch_id, ta.flow_id from tache pr, (select TCH_ID, c.flow_id from event_q a, staff_event b, tache c where (a.event_type = '2' OR a.event_type = '1') and a.event_id = b.event_id and (a.flag is null or a.flag = '1') and b.staff_id = 1 and a.content_id = c.tch_id) ta where ta.flow_id = pr.sub_flow_id(+) and pr.flow_id is null ``` 这条 SQL 语句本身非常复杂,但是我们可以看出它的执行计划,截取如下: * 首先是外面的 tache 表先和 ta 结果集的 tache 表连接,然后再和 STAFF_EVENT 连接,最后和 EVENT_Q 完成连接! 由于 staff_event 这个表和 TACHE 表没有连接条件,就是没有体现 staff_event 的某某字段和 TACHE 表的某某字段关联的地方,所以这里产生了笛卡尔乘积!因此本次查询非常的慢。 那么如何处理呢?其实很简单,我们发现,整个语句最终只返回 42 条说明 ta 这个结果集本身返回的记录数并不多,虽然 tache 是一张大表,但是这段语句如果没有笛卡尔乘积,应该非常快! 简单研究发现,只要 ta 结果集内部先完成表连接,再和外部连接,就不至于产生笛卡尔乘积了,因为在 ta 结果集里,我们可以 STAFF_EVENT b 和 EVENT_Q a 先完成连接,他们是有连接条件的,条件是 a.event_id = b.event_id 。 接下来这两个连接再和 ta 结果集中的 STAFF c 表连接,又有连接条件,条件是:a.content_id = c.tch_id。 最好再和外面的 tache pr 表完成连接,连接条件是:ta.flow_id = pr.sub_flow_id(+) 如此看来,不可能有笛卡尔! 解决方法 那么如何让 ORACLE 的子查询不要先自行逛街出去和外面表先连接,再会过来连接内部剩下的部分呢?很简单,只要修改为如下即可,增加 rownum 部分: ```sql select ta.tch_id, ta.flow_id from tache pr, (select TCH_ID, c.flow_id, rownum from event_q a, staff_event b, tache c where (a.event_type = '2' OR a.event_type = '1') and a.event_id = b.event_id and (a.flag is null or a.flag = '1') and b.staff_id = 1 and a.content_id = c.tch_id) ta where ta.flow_id = pr.sub_flow_id(+) and pr.flow_id is null ``` 总结 在 SQL 项目中,表连接的优化非常重要。我们可以通过简单的修改来避免笛卡尔乘积,提高查询的速度。这三个例子来源于近期一个月内我们部门遇到的经典 SQL 问题,都是来自集团应用、安徽应用、浙江应用,但是它们都有一个共同的特点,就是表连接的优化。
- 粉丝: 6044
- 资源: 2万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Cloud框架的统一登录与日志管理系统.zip
- spire.presentation.free.zip
- (源码)基于Spring Boot框架的简历管理系统.zip
- C#ERP生产管理系统源码带开发文档数据库 SQL2008源码类型 WebForm
- (源码)基于Spring、Struts2和Hibernate的学生管理系统.zip
- 房屋冰凌冰锥冰柱检测数据集VOC+YOLO格式147张1类别.zip
- (源码)基于物联网技术的COVID患者健康监测系统.zip
- 考研数学必备高等数学公式速查手册
- 基于用户浏览网站偏好分类的FlinkML快速演示样例+Java项目源码+文档说明+代码注释
- (源码)基于Python和Kuramoto模型的无标度网络同步检测系统.zip