2008-01-30
请将大部分子查询转换为外部连接
关键字: sql
今天下午,项目代码的review结果送回来了。一共被指摘了50多条,
。其中有这么一条,指摘的内容是我们在SQL中使用了“ not in ”这样的子查询,要求我们改成 join 方式。
这条SQL是这个样子的:
这条SQL是这个样子的:
select x, y, z from table_a where user_id=xxx and user_name not in (select user_name from table_b)
这条SQL怎么可能转化成join方式呢?再说有什么必要吗? 一时间大家开始嘲笑指摘的人。不过人家毕竟指摘出来了,所以无论如何也得看看是否可以修改。于是乎,就上网找吧,结果一找还真找到了:
select a.x, a.y, a.z from table_a as a left join table_b as b on a.user_name=b.user_name where a.user_id=xxx and b.user_name is null
哎,真是无比惭愧啊!平时还以为SQL语句不在话下,结果发现自己是那么的无知。 那么修改成join有什么好处呢?好处就是join可以通过索引来优化,而子查询不可以,差别还是很大的。而且ms的文档也说大部分的子查询其实都可以转换为外部连接的方式。
这次也算是学到了一手,以后要将大部分子查询转换为外部连接。
评论
javatar
2008-04-04
不同的数据优化方案不同, 当然子查询, in等操作尽可能少用.
在mysql中, 最好连join也别用. 直接多表查询可能会快些, 如: select a.x, b.y from a, b
优化不能靠猜的, 要让数据说话, 用一些工具分析评估才能找到根本问题.
所以说项目组DBA是不能少的.
在mysql中, 最好连join也别用. 直接多表查询可能会快些, 如: select a.x, b.y from a, b
优化不能靠猜的, 要让数据说话, 用一些工具分析评估才能找到根本问题.
所以说项目组DBA是不能少的.
yananay
2008-04-03
不一样的,上面的是联合查询语句,所以会出现 b.user_name is null 的情况。
但这种纪录只是因为联合查询才出现的,而不是真的有这么一条记录。
但这种纪录只是因为联合查询才出现的,而不是真的有这么一条记录。
skzr.org
2008-04-01
select a.x, a.y, a.z from table_a as a
left join table_b as b on a.user_name=b.user_name
where a.user_id=xxx and b.user_name is null
==>
select a.x, a.y, a.z from table_a as awhere a.user_id=xxx and a.user_name is null
这两者有差别没?有点没搞清楚
left join table_b as b on a.user_name=b.user_name
where a.user_id=xxx and b.user_name is null
==>
select a.x, a.y, a.z from table_a as awhere a.user_id=xxx and a.user_name is null
这两者有差别没?有点没搞清楚
发表评论
- 浏览: 135175 次

- 详细资料
搜索本博客
我的相册
tdd
共 3 张
共 3 张
最新评论
-
TDD,想说爱你不容易
stevenwang 写道这个论题我喜欢。 早想写一点文字,来纪念我TDD的失 ...
-- by kozyan -
测试驱动?很傻很天真
同情,很傻很天真
-- by passyt -
BNF范式
确实很有兴趣,刚刚学习完状态机的部分,对比一下CT中状态机的实现,很有收获
-- by yananay -
BNF范式
看来你对编译知识很有兴趣, 希望你能有所突破. BNF本身并不复杂, 只是表达 ...
-- by javatar -
CT中表达式处理的思考
你考虑的很对, 当时设计时, 我也考虑过这个问题, 在编译原理中, 通常都会把" ...
-- by javatar






评论排行榜