`
sony-soft
  • 浏览: 1105661 次
文章分类
社区版块
存档分类
最新评论

请将大部分子查询转换为外部连接

 
阅读更多

from:yananay发表于http://yananay.javaeye.com/blog/160591

请将大部分子查询转换为外部连接

关键字: sql

今天下午,项目代码的review结果送回来了。一共被指摘了50多条。其中有这么一条,指摘的内容是我们在SQL中使用了“ not in ”这样的子查询,要求我们改成 join 方式。
这条SQL是这个样子的:
Sql代码
  1. selectx,y,zfromtable_awhereuser_id=xxxanduser_name
  2. notin(selectuser_namefromtable_b)
这条SQL怎么可能转化成join方式呢?再说有什么必要吗? 一时间大家开始嘲笑指摘的人。不过人家毕竟指摘出来了,所以无论如何也得看看是否可以修改。于是乎,就上网找吧,结果一找还真找到了:

Sql代码
  1. selecta.x,a.y,a.zfromtable_aasa
  2. leftjointable_basbona.user_name=b.user_name
  3. wherea.user_id=xxxandb.user_nameisnull

哎,真是无比惭愧啊!平时还以为SQL语句不在话下,结果发现自己是那么的无知。 那么修改成join有什么好处呢?好处就是join可以通过索引来优化,而子查询不可以,差别还是很大的。而且ms的文档也说大部分的子查询其实都可以转换为外部连接的方式。 这次也算是学到了一手,以后要将大部分子查询转换为外部连接。

下边是帖子发表后的随贴:

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
这两者有差别没?有点没搞清楚
yananay 2008-04-03 (这里是主人回复)
不一样的,上面的是联合查询语句,所以会出现 b.user_name is null 的情况。
但这种纪录只是因为联合查询才出现的,而不是真的有这么一条记录。
javatar 2008-04-04
不同的数据优化方案不同, 当然子查询, in等操作尽可能少用.
在mysql中, 最好连join也别用. 直接多表查询可能会快些, 如: select a.x, b.y from a, b
优化不能靠猜的, 要让数据说话, 用一些工具分析评估才能找到根本问题.
所以说项目组DBA是不能少的.
分享到:
评论

相关推荐

    《Pro Oracle SQL》CHAPTER2--2.8 Subquery Unnesting

    这是一种查询优化技术,Oracle会尝试将子查询转换为连接操作,以提高查询效率。当子查询的结果集较小且可以一次性处理时,Oracle会考虑将子查询的每个结果行与外部查询的每一行进行连接,而不是先执行子查询再做...

    DB2到GreenPlum/PostgreSQL的转换指南

    - **脚本转换工具**:这些工具可以分析现有的DB2 SQL脚本,并尝试将其转换为适用于GreenPlum或PostgreSQL的等效脚本。 - **手动审查**:虽然自动化工具很有帮助,但最好还是由熟悉两种数据库系统的专家进行最终的...

    Mysql子查询IN中使用LIMIT应用示例

    在这里,外部的子查询创建了一个名为`tp`的临时表,存储了`state = $state`的前10个`aid`。然后,主查询将`mapply`表中的`aid`与这个临时表进行比较,实现了预期的效果。 子查询优化是数据库性能的关键部分,尤其是...

    实验8 AD模数转换实验(0809)1

    ADC0809是一款8位逐次逼近型A/D转换器,它能够将模拟信号转化为数字信号,适用于各种需要将连续信号数字化的场景。电位器作为模拟量的输入源,其变化的电压值被ADC0809接收并进行转换。转换后的二进制数据随后通过74...

    mysql关联子查询的一种优化方法分析

    在上述示例中,我们可以将查询转换为: ```sql SELECT * FROM table1 INNER JOIN table2 ON table1.uuid = table2.uuid WHERE table2.id >= 30000; ``` 这种JOIN查询通常比相关子查询更高效,因为它允许数据库在...

    TCP拦截和网络地址转换

    如果两个连接都成功地实现,路由器就会将两个连接进行透明的合并。路由器有更 为严格的超时限制,以防止其自身的资源被.. S Y N攻击耗尽。在监视模式下,路由器被动地观 察h a l f - o p e n连接(没有完成.. T C P...

    oca 11g sybex oracle

    - **定义子查询**:子查询是在另一个查询内部执行的查询,通常作为外部查询的一部分。 - **描述子查询可以解决的问题类型**:子查询常用于处理复杂的数据检索任务,如基于其他查询的结果进行过滤等。 - **列出子查询...

    filter优化

    - 将子查询转换为外部查询的一部分,从而简化内部逻辑。 - 使用视图或物化视图来存储预先计算的结果,减少实时查询的复杂度。 5. **利用Oracle的高级特性**: - 考虑使用Oracle的分区功能,特别是对于大型表,...

    数据库原理实验四 复杂查询-模板.doc

    2. **子查询**:子查询是嵌套在另一个查询中的查询,它可以作为外部查询的一部分,用于提供条件或者获取特定数据。例如,找出比“林红”年龄大的男学生,就需要先查询出“林红”的年龄,然后用这个结果作为子查询的...

    程序员的SQL金典7-8

     8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异...

    程序员的SQL金典.rar

    第2部分为进阶篇,讲解了函数、子查询、表连接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术;第3部分为案例篇,对前两部分的知识进行了综合运用。  本书适合程序开发人员及数据库...

    mysql explain详解

    4. **避免子查询优化**:尽可能将子查询转换为连接查询,或者使用EXISTS替代IN。 5. **合理使用函数和计算**:避免在`WHERE`子句中使用函数或计算表达式,这可能导致无法使用索引。 6. **避免数据类型不匹配**:确保...

    使用adc8009和单片机设计的电子电压表

    - **A/D转换器**:负责将选定通道的模拟信号转换为数字信号。 - **三态输出锁存器**:用于锁存已经完成转换的数字信号,并在OE端为高电平时,允许外部读取这些数据。 #### 引脚功能 - **D7-D0**:8位数字量输出...

    sql语句查询使用

    - **在SELECT语句中使用子查询**:可以将子查询结果作为列或表的一部分,增强查询能力。 以上内容涵盖了SQL语句查询使用的多个方面,从基础概念到高级功能,旨在帮助读者全面掌握SQL语言,无论是初学者还是有经验的...

    单片机原理及应用 西安电子科技大学出品 单片机开发教程 第5章 MCS-51系列单片机的接口及应用 共99页.ppt

    - A/D转换器(模拟/数字转换器)用于将模拟信号转换为数字信号,使单片机能处理来自传感器等设备的模拟输入。 - 接口设计涉及选择适当的转换器,设置合适的采样率,以及编写控制A/D转换的程序。 4. **D/A转换器...

    《电子设计综合实验》.ppt

    在微控制系统中,输入通道是连接外部设备和微处理器的关键部分,它负责将来自被控对象的模拟信号转化为数字信号,以便微处理器能够理解和处理。 模数转换电路是输入通道的核心,常见的有8至16位的A/D转换器。例如,...

    数据库知识点总结.pdf

    非相关子查询独立于外部查询,只执行一次,而相关子查询则与外部查询紧密关联,对外部查询的每一行都执行一次。视图作为数据库的一个虚拟表,可以简化数据查询,隐藏复杂的数据库结构,简化权限管理,并促进数据共享...

    快速学习SQL语句结构化查询

    - **相关子查询**:子查询的结果依赖于外部查询中的某些值。 - **EXISTS、ANY、ALL的使用**:进行存在性检查或多值比较。 ### 操作数据 - **数据操作语句**:`INSERT`、`UPDATE`、`DELETE`等。 - **插入语句**: ...

    sql语言基础

    相关子查询会在外部查询执行时根据内部查询的结果动态更新。 8. **Oracle的特性**:Oracle数据库对SQL进行了扩展,如提供了`DESCRIBE`命令来查看表结构,以及丰富的函数和特性支持,使得SQL在Oracle环境下更加功能...

    Explain详解及SQL优化实战.docx

    - `CONST`, `SYSTEM`:MySQL能够优化查询的一部分,将其转换为一个常量。用于主键或唯一键的比较,最多只有一行匹配。 - `EQ_REF`:使用主键或唯一键的索引进行连接操作,最多返回一条记录。 - `REF`:索引的某些...

Global site tag (gtag.js) - Google Analytics