关于SQL左连接效率问题
2016-10-17 00:00
447 查看
项目在开发新功能,涉及到一张表,里面数据有一百多W的条,表字段竟然有一百多个。。实在是没法再往下新增加字段了,于是就新增了一张表,用做扩展吧,通过表key来关联。后来涉及到以扩展表中某个字段作为查询条件进行检索,于是很自然就会想到通过left join新建个视图,然后进行检索这个视图。可是很不幸...慢的要死,查一下要三十几秒...
然后 explain plan一下语句,看到对两个表都进行了全表扫描。
解释一下left join大概意思: 首先取出左边表中所有数据,然后再加上与左右两个表匹配的的数据。 这样一来速度自然就慢了
于是只能抛弃这种方法。
优化视图
先找出主表中扩展表没有的数据,然后再关联主表与扩展表,最后通过union all将两个查询结果联合起来形成一个视图。
这样就避免了对主表进行了全表扫描。
SELECT * FROM LANDREG.TDDJ_TDDJDA T LEFT JOIN LANDREG.TDDJ_TDDJDA_EXT E ON T.TDDJID = E.TDDJID
然后 explain plan一下语句,看到对两个表都进行了全表扫描。
解释一下left join大概意思: 首先取出左边表中所有数据,然后再加上与左右两个表匹配的的数据。 这样一来速度自然就慢了
于是只能抛弃这种方法。
优化视图
先找出主表中扩展表没有的数据,然后再关联主表与扩展表,最后通过union all将两个查询结果联合起来形成一个视图。
SELECT T.TDDJID, '' AS FILEBARCODE FROM TDDJ_TDDJDA T WHERE NOT EXISTS (SELECT 1 FROM LANDREG.TDDJ_TDDJDA_EXT E WHERE E.TDDJID = T.TDDJID) UNION ALL SELECT T.TDDJID, E.FILEBARCODE FROM LANDREG.TDDJ_TDDJDA T, LANDREG.TDDJ_TDDJDA_EXT E WHERE T.TDDJID = E.TDDJID
这样就避免了对主表进行了全表扫描。
相关文章推荐
- 关于数据库优化2——关于表的连接顺序,和where子句的前后顺序,是否会影响到sql的执行效率问题
- 关于PL SQL Developer连接远程Oracle的配置问题
- 关于用sqlserverr创建一个Oracle的连接服务器问题
- Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- 关于嵌套和连接的效率问题
- Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- 关于ling to sql左右连接的问题
- Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- (转)Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- 关于VC数据库开发中数据库连接与效率的问题-----一点体会和经验
- sql 关于left join 左连接问题(新手写)
- 关于pl/sql连接64位oracle的问题
- 关于数据库查询语句SqlDataReader的连接释放问题的解决办法
- 关于sql中左连接的两个问题
- 关于在java中连接MS SQL Server 2005 JDBC的问题及解决办法
- 关于sql连接查询问题
- 关于sql里left join的效率问题
- 看一看关于在sql查询过程中的连接问题
- 关于嵌套查询和连接查询的效率问题
- 关于在java中连接MS SQL Server 2005 JDBC的问题及解决办法