`

SQL优化—SQL子句执行顺序和Join的一点总结

    博客分类:
  • SQL
阅读更多

原文:点击打开链接

 

1.笛卡尔积(Cartesian product)

顾名思义, 这个概念得名于笛卡儿. 在数学中,两个集合 X 和 Y 的笛卡儿积(Cartesian product),又称直积,表示为 X × Y,是其第一个对象是 X 的成员而第二个对象是 Y 的一个成员的所有可能的有序对.

假设集合A= {a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选 课情况。


2.Join类型  

cross join 是笛卡儿乘积就是一张表的行数乘以另一张表的行数.
inner join 只返回两张表连接列的匹配项.
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null.
right join 
第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null. 
full join 
返回两张表中的行 left join+right join.

3.在对两表进行各种类型的join (cross, left, right, full, inner)时, 都需要构造笛卡尔积.

有时想想不可思议, 若两个特大表进行join, 难道sql就直接上笛卡尔积吗? 难道不事前进行on的条件过滤吗? 那数据量得多大?

 

4.查一下MSDN就清楚了整个SQL的执行顺序.

http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

Processing Order of the SELECT statement
The following steps show the processing order for a SELECT statement.

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE or WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

 

也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据. 

这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

如果没有在查询中指定某一子句,将跳过相应的步骤。

 

下面是<<Inside Microsoft SQL Server 2008 T-SQL Querying>>一书中给的一幅SQL 执行顺序的插图.



 

5.On的其余过滤条件放Where里效率更高还是更低?

select * from table1 as a

inner join table2 as b on a.id=b.id and a.status=1

 

select * from table1 as a

inner join table2 as b on a.id=b.id

where a.status=1

查查MSDN就清楚了. http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

There can be predicates that involve only one of the joined tables in the ON clause. Such predicates also can be in the WHERE clause in the query. Although the placement of such predicates does not make a difference for INNER joins, they might cause a different result when OUTER joins are involved. This is because the predicates in the ON clause are applied to the table before the join, whereas the WHERE clause is semantically applied to the result of the join.

 

翻译之后是, 如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

综合一下, 感觉还是放在on里更有效率, 因为它先于where执行.

 

听说可以通过sql的查询计划来判别实际的结果, 明天再研究, 欢迎高手给与批评指正.

 

********************************************************************************************************

2011/11/21 最新体会

刚看到<<Microsoft SQL Server 2008技术内幕: T-SQL查询>>一书中对于连接的描述和我先前理解的不太一样;

Itzib在书上说先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走, 如果join 是left join, 就把on过滤掉的左主表中的数据再添加回来; 然后再执行where里的过滤;

on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.

只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤.

********************************************************************************************************

参考资料:

SELECT (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

 

FROM (Transact-SQL)

http://msdn.microsoft.com/en-us/library/ms177634(v=SQL.100).aspx

 

SQL Server 查询处理中的各个阶段(SQL执行顺序) 
http://www.cnblogs.com/chinabc/articles/1597198.html 

 

INNER JOIN时条件放在ON里还是WHERE里效率更高
http://social.msdn.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/e1198287-96d5-4e9e-b1d0-d2d4f5ba4e20

 

连接语句的运算顺序或原理
http://social.msdn.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/6f61bd10-6fb9-4035-bd51-d9cc13f7132a/

 

 

 

 

  • 大小: 63.2 KB
分享到:
评论

相关推荐

    sql执行顺序大总结

    SQL 执行顺序大总结 SQL 执行顺序是一个非常重要的概念,对于任何一个 SQL 开发者来说都非常重要。今天,我们将深入探讨 SQL 执行顺序的每一个步骤,从 FROM 到 SELECT,了解每一个步骤的执行顺序和细节。 FROM ...

    SQL Select语句完整的执行顺序

    ### SQL Select 语句完整的执行顺序 在数据库查询语言(SQL)中,`SELECT`语句是最常用的查询数据的方式之一。正确理解`SELECT`语句的执行顺序对于编写高效、准确的查询至关重要。本文将详细介绍SQL Select语句的...

    SQL语句执行顺序说明

    SQL语句的执行顺序决定了其性能表现,理解这一点对于优化查询至关重要。以下是一些基本的执行顺序: 1. **FROM子句**:首先处理FROM子句,确定需要操作的表或视图。Oracle从右向左处理表名,最后一个表名为驱动表。...

    SQL语句的执行原理及顺序

    了解 SQL 语句的执行顺序可以帮助开发人员更好地优化查询语句,提高数据库性能。 SQL 语句的执行顺序可以分为 11 个步骤: 1. FROM 子句:首先对 FROM 子句中的前两个表执行一个笛卡尔乘积,生成虚拟表 vt1。 2. ...

    SQL查询原理及执行顺序

    SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其查询原理和执行顺序对于数据库性能优化至关重要。本文将深入探讨SQL查询的执行过程,帮助读者理解如何构建高效查询。 #### SQL语句执行...

    收获不止SQL优化

    第1章 全局在胸——用工具对SQL整体优化 1 1.1 都有哪些性能工具 1 1.1.1 不同调优场景分析 2 1.1.2 不同场景对应工具 2 1.2 整体性能工具的要点 4 1.2.1 五大性能报告的获取 5 1.2.2 五大报告关注的要点 10 ...

    sql优化经验总结

    通过阅读"sql优化经验总结V1.5.ppt"和"sql优化经验总结.ppt",可以更深入地学习到更多实用技巧和案例分析,进一步提升在Oracle SQL优化方面的能力。不断学习和实践,才能在这个领域取得更大的成就。

    sql优化sql优化sql优化sql优化sql优化

    以上知识点在"SQL Server性能优化.doc"和"SQL Server 2000数据库优化方案参考.doc"中可能有更详细的解释和案例分析。深入理解并实践这些优化策略,将有助于提升SQL Server的性能,从而改善整个系统的运行效率。

    sql优化规则详解(一些小总结)

    SQL优化是提升数据库性能的关键步骤,它涉及到对SQL语句的结构、执行顺序以及数据库设计的深入理解。以下是对标题和描述中所述知识点的详细解释: 1. **选择最有效的表名顺序**:在FROM子句中,Oracle解析器遵循从...

    基于SQL Server的SQL优化.pdf

    总结,SQL Server的SQL优化涉及多个层面,包括但不限于查询设计、索引策略、存储过程优化、执行计划分析、资源管理和数据库设计。理解并掌握这些知识,能够有效地提升SQL Server的性能,确保数据处理的高效性和可靠...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    1. **SQL基础与语法**:面试通常会涉及到SQL的基本概念,如SELECT语句、JOIN操作、子查询、聚合函数(COUNT、SUM、AVG等)、WHERE和HAVING子句的区分。 2. **索引原理**:索引是提高查询速度的关键,面试中可能会问...

    sql server 优化总结

    在SQL Server数据库管理系统中,优化是提升系统性能的关键步骤,涉及到查询执行速度、资源利用率以及整体系统的稳定性。本文将深入探讨SQL Server优化的各种策略和技术,旨在帮助数据库管理员和开发人员提高工作效率...

    SQL优化经验总结34条.pdf

    ### SQL优化经验总结34条 #### 一、选择最有效率的表名顺序 - **要点**: 在基于规则的优化器(RBO)中,Oracle解析器从右至左处理FROM子句中的表名。为了提高性能,应将记录条数最少的表放在最后,即作为基础表。...

    通过分析SQL语句的执行计划优化SQL

    ### 通过分析SQL语句的执行计划优化SQL 在数据库管理与开发过程中,SQL语句的性能优化至关重要。本文将详细介绍如何理解SQL及其执行计划,并给出具体的优化策略。通过优化SQL,可以显著提升应用程序的响应速度及...

    Oracle数据库SQL优化总结

    15. **识别低效SQL语句**:监控和分析SQL执行计划,找出执行时间长、资源消耗大的语句进行优化。 以上技巧是提高Oracle数据库性能的基础方法,通过实践和调整,可以显著提升数据库的运行效率。在日常开发中,了解并...

    SQL语句中SELECT语句的执行顺序

    ### SQL语句中SELECT语句的执行顺序 在SQL语言中,`SELECT`语句是进行数据查询的核心工具。为了确保查询结果的准确性和效率,理解`SELECT`语句内部的执行顺序至关重要。本文将详细解析`SELECT`语句各子句的执行...

    85提纲挈领的告诉你,SQL语句的执行计划和性能优化有什么关系?.pdf

    执行计划显示了数据库执行SQL语句时的逻辑步骤,包括查询的顺序、使用的索引、返回的数据量估计、数据的排序和分组等操作。通过理解执行计划,数据库管理员和开发人员可以诊断性能问题,并相应地优化查询。 一、SQL...

    《基于Oracle的SQL优化》PDF版本下载.txt

    根据提供的文件信息,本文将对《基于Oracle的SQL优化》这一主题进行深入解析,包括但不限于SQL优化的重要性、Oracle数据库的特点以及具体的SQL优化方法等。 ### SQL优化的重要性 SQL(Structured Query Language)...

    sql的执行效率优化

    SQL 执行效率优化需要从多方面入手,选择最有效率的表名顺序、Where 子句中的连接顺序、Select 子句中避免使用 ‘*’、减少访问数据库的次数、重设 ARRAYSIZE 参数、使用 DECODE 函数、整合简单、无关联的数据库访问...

    sql优化书籍大全

    1. 减少查询次数:通过联合查询、子查询优化和存储过程等方式,将多次数据库交互合并为一次,降低网络传输和数据库处理的压力。 2. 减小数据量:通过精确查询和使用LIMIT限制返回结果的数量,避免不必要的全表扫描...

Global site tag (gtag.js) - Google Analytics