`

请问在一个查询里表连接的顺序对查询的性能是否有影响

阅读更多

请问在一个查询里表连接的顺序对查询的性能是否有影响?

楼主wxbfly(背着黄金的飞鸟)2002-12-11 11:38:45 在 MS-SQL Server / 基础类 提问

如果有影响,我想问连接时的顺序是从左到右还是从右到左?   
    
  如:   a   inner   join   b   on   condition1   left   outer   join   c   on   condition2     
          inner   join   d   on   condition3   
  其执行连接的顺序是什么?如果各个表的大小不一样,那么应该遵循什么规则才能达到最快速度?   
    
  不好意思,在书上找不到,就上来问啦。另外,where子句里的各个条件语句放置顺序是否对查询有影响?   
 问题点数:100、回复次数:21Top

1 楼CCEO(CSDN的CEO)回复于 2002-12-11 11:43:04 得分 20

sql   server的自动优化机制使得这个次序是没有意义的,除非你自己指定了油画选项。   
 Top

2 楼CrazyFor(冬眠的鼹鼠)回复于 2002-12-11 11:45:06 得分 0

还是找书吧,清楚点   
    
  简单说一下,   
    
  A和B表   
  A   left   outer   join   B   =   B   right   outer   join   A   
    
  A   left   outer   join   B   适合A和B的一对多关系,即A的一条记录对应B的多条记录,如“-->”   如引号中的箭头,结果集中只包括A表中有的记录。Right   outer   join   如“<--”   
  A   full   outet   join   B     如“<-->”   
    
 Top

3 楼Chiff(~o~)回复于 2002-12-11 11:45:27 得分 30

where子句里的各个条件语句放置顺序是否对查询有影响?   
    
  据我观察没有。因为不管你怎样放,mssql最后都会按他的规则排顺序。   
  据我所知,所有常量逻辑总是会排在最前面。比方说:   
  where   1=1   and   列a='a'   
  sql在查询时总是会把1=1之类的放在前面。Top

4 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 11:51:16 得分 0

没有连接顺序?好象不对吧,我记得哪里说可以用括号来改变连接的顺序的。请各位明示。   
    
  to   CCEO()   :   
  请问油画机制是做什么用的?Top

5 楼Chiff(~o~)回复于 2002-12-11 11:53:40 得分 0

(油画)优化机制。Top

6 楼microd(重构一切)回复于 2002-12-11 11:55:08 得分 0

不用说,肯定有Top

7 楼Chiff(~o~)回复于 2002-12-11 11:58:26 得分 0

关于条件顺序判断,很容易测试的:   
  拿个除以零的条件放在条件列表里面。   
    
 Top

8 楼microd(重构一切)回复于 2002-12-11 12:00:45 得分 10

Where   后面的条件有影响,在同等条件,把记录多条件的放在最后面,因为Where   语句总是从最后面的语句开始执行,这样会减少过滤时间(也就是执行时间呢!)。Top

9 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 12:07:45 得分 0

ok,我可以测where后条件的执行顺序。   
    
  to   microd(做人真累):   
  关于你说的从后到前的执行顺序你有没有测过,是否真的是这样?Top

10 楼mylovexs(不了塵)回复于 2002-12-11 12:35:27 得分 10

有影響,sql查詢優化器根據where循序採用索引,除非指定索引Top

11 楼Chiff(~o~)回复于 2002-12-11 12:37:00 得分 0

microd(做人真累):   
  “因为Where   语句总是从最后面的语句开始执行”   
  你试过吗?何以见得?Top

12 楼Chiff(~o~)回复于 2002-12-11 13:14:58 得分 0

关于条件执行的顺序,让我们来做一个测试!   
    
  create   table   test(id   int)   
  insert   into   test   values(1)   
  insert   into   test   values(2)   
  ------------------------------------------   
  select   *   from   test   where   1/0=1   or   1=1   
  --1   
  --2   
  select   *   from   test   where   1/0=1   or   id   in(1,2)   
  --遇到零除错误   
  select   *   from   test   where   1/0=1   and   id   =   3   
  --遇到零除错误   
  ------------------------------------------   
  select   *   from   test   where   id/0=id   or   id=id   
  --遇到零除错误   
    
  select   *   from   test   where   id=id   or   id/0=id   
  --1   
  --2   
  -------------------------------------------   
  select   *   from   test   where   1/0=1   or   id   =   1   
  --遇到零除错误   
  -------------------------------------------   
  select   *   from   test   where   id/0   =   1   or   id   =   id     
  --遇到零除错误   
    
  select   *   from   test   where   id   =   id   or   id   /   0   =   1   
  --1   
  --2   
  -------------------------------------------   
  select   *   from   test   where   id/0   =1   or   1=1   or   id/0   =   4   or   1/0=1   or   id=id/0   
  --1   
  --2   
  select   *   from   test   where   id/0   =1   and   1=2   and   id/0   =   4   and   1/0=1   and   id=id/0   
  --没有结果,也没有报错   
  -------------------------------------------   
    
  至少可以看出:   
  sql在执行条件语句的时候是将条件分级别匹配的,级别最高的是:   
    
  常量与常量的比较   
    
  而且级别分得非常细,所以我也分析不出确切的机制。   
    
  只有在级别完全相同的时候,才是从左至右或从右至左来匹配。   
  不对之处请大家指正。Top

13 楼Chiff(~o~)回复于 2002-12-11 13:52:56 得分 0

大家来讨论一下。Top

14 楼xystarch(Cyan)回复于 2002-12-11 14:14:54 得分 0

我觉得对这个问题的分析需要对SQL语言的底层结构和它所基于的数学理论进行讨论,比如关系代数与集合演算.   
  但是SQLServer内置的查询优化器会改变实际查询的方式,在QA里面看到的   
  Executing   Plan并不符合我们实际的sql语句   
  好像有个开关   
  set   queryOptima=off(具体是什么我忘了)   
  将优化器关掉后就可以看到连接顺序和条件顺序对于性能优化的影响了.Top

15 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 14:19:15 得分 0

谢谢Chiff(~o~)   的关心。   
    
  我想讨论对大家都会有好处,我可以加分,请各位高手继续。Top

16 楼xystarch(Cyan)回复于 2002-12-11 14:21:01 得分 30

SQL   SERVER   的查询引擎是基于开销的查询引擎.   
  基于开销的查询优化器在备选计划中选择应答   SQL   查询的计划。选择是基于对执行特殊计划的开销估算(I/O   操作数、CPU   秒数,等等)而作出的。它通过记录表或索引中记录的数目和构成的统计数字估算这些开销。与基于语法的查询优化器不同,它不依赖于查询的确切语法或查询中的子句顺序。   
 Top

17 楼Chiff(~o~)回复于 2002-12-11 14:26:41 得分 0

xystarch说得有道理。Top

18 楼Chiff(~o~)回复于 2002-12-11 14:27:31 得分 0

问题是,mssql是怎样判断开销的呢?Top

19 楼zxdragon(zxdragon)回复于 2002-12-11 14:28:03 得分 0

实际上ON后面的条件内容也很重要。   
  通常在表连接时,一般采用   
  A   LEFT   JOIN   B   ON   A.id=B.id   
  如果可能写成   
  A   LEFT   JOIN   B   ON   A.id=B.id   AND   A.Name=B.Name   AND   A.Date=B.Date   ...   
  虽然   A.id=B.id   就一定决定   A.Name=B.Name   AND   A.Date=B.Date   
  但是还是劝你写的繁一点,这样在你联接N多个表或数据量较大时,你的查询时间会少很多。   
  血的教训呀~~~Top

20 楼xystarch(Cyan)回复于 2002-12-11 14:39:49 得分 0

http://www.microsoft.com/china/technet/sql/Technote/dat411.asp   
    
  我们所写出的sql语句是一个查询计划,是抽象数学演算的实现,最值得信赖的优化还是要根据关系代数与集合演算来做   
  我的导师告诉我说:将你的sql语句转化成数学演算来分析怎么实现优化!   
  但是实际情况中我们又不得不考虑表中数据量对于性能的影响   
  基于开销和基于语法这两种模型的结合才是最理想的.   
  但是这个mssql是怎么实现的?的确是个问题(我想这个可能是mssql的核心所在吧).Top

21 楼xystarch(Cyan)回复于 2002-12-11 14:49:16 得分 0

我找到那条语句了   
    
  SET   FORCEPLAN   ON   
    
  将会强制查询基于语法而不是开销.

分享到:
评论

相关推荐

    数据结构 用顺序表和链表实现表的连接

    要实现表的连接,可以创建一个大数组,用于存储不同表的数据,通过索引将它们链接在一起。连接操作可能涉及合并两个有序顺序表,这可以通过遍历两个表并按顺序插入元素到新表中完成。 然而,顺序表的扩展性较差,...

    查询优化:sql2000中的连接两个表的查询语句的执行路径对性能的影响比较

    在SQL Server 2000中,连接两个表的查询语句是数据库操作中的常见操作,对于性能的影响至关重要。查询优化是数据库管理的核心任务之一,它涉及到如何有效地执行SQL语句,以达到最快的响应时间和最小的系统资源消耗。...

    论文研究-XQuery查询优化中结构连接顺序选择算法.pdf

    综上所述,这篇论文的核心内容集中在对XQuery查询语言中结构连接顺序选择算法的研究和优化,其目的是在处理XML数据查询时提升性能和效率。通过具体的算法改进,论文展示了优化结构连接顺序对提升XQuery查询性能的...

    oracle连接查询SQL性能测试

    在Oracle中,连接查询(JOINs)是整合多个表数据的关键操作,其性能直接影响到数据库的整体效率。这篇博客文章可能探讨了如何通过不同类型的连接(如内连接、外连接等)和优化策略来提升查询速度。 描述虽然为空,...

    SQL的数据查询功能之三---多表连接查询

    DBMS 执行连接操作的过程是,首先在表 1 中找到第一个元组,然后从头开始顺序扫描或按索引扫描表 2,查找满足连接条件的元组,每找到一个元组,就将表 1 中的第一个元组与该元组拼接起来,形成结果表中一个元组。...

    SQL多表连接查询优化的相关研究ppt课件.ppt

    SQL多表连接查询是一个复杂的问题,需要考虑多种因素,例如连接顺序、属性相关性、选择度估计等。优化这种查询是数据库管理系统的关键任务之一。本文将对SQL多表连接查询优化的相关研究进行概括和总结。 1. 连接...

    Oracle 多表查询优化

    Oracle 多表查询优化是指在 Oracle 数据库管理系统中,为了提高多表查询的效率和性能采取的一些优化策略和技术。在 Oracle 中,多表查询是指从多个表中检索数据的操作。这种操作可能会占用大量的系统资源和时间,...

    ORACLE多表查询优化

    在 Oracle 数据库中,多表查询是一种常见的查询方式,但它也可能会对数据库性能产生影响。本文将讨论 Oracle 多表查询优化的几种方法,帮助开发者提高数据库性能。 1. 选择最有效率的表名顺序 在基于规则的优化器...

    多关系SQL查询中连接顺序的优化.pdf

    连接顺序的优化是其中的一个重要部分,它直接影响查询的效率。 ### Oracle数据库中的应用案例 文章还介绍了Oracle数据库中多关系连接运算中连接顺序的优化方法,并通过浙江省新华书店集团采供子系统的应用案例来...

    面向多表数据连接投影和连接顺序的优化方法.docx

    当处理的表数量增多时,连接顺序的选择将直接影响到查询执行的成本和I/O代价。传统优化方法在这一领域主要集中于寻找最优的连接顺序,却往往忽略了投影列的选择,这使得它们在实际应用中受到限制。 为了解决这一...

    SQL查询原理及执行顺序

    7. **选择连接顺序**:在多表连接中,确定先连接哪两个表以及将哪个表作为源数据表,这对于优化性能至关重要。 8. **选择数据搜索路径**:根据上述条件,数据库会选择最有效的数据搜索路径,可能包括全表扫描、索引...

    SQL_Server_2008查询性能优化

    总的来说,SQL Server 2008查询性能优化是一个涉及多个层面的综合过程,包括查询设计、索引管理、存储过程、数据库设计以及服务器配置等多个方面。通过深入理解和实践这些技巧,开发者可以显著提升其SQL代码的运行...

    Oracle中表的连接及其调整.

    案例:在一个员工(emp)和部门(dept)的关联查询中,如果已知员工编号(empno=7900),Oracle 可能会选择 emp 作为驱动表,利用唯一索引 PK_EMP 快速定位该员工,然后通过部门编号(deptno)与 dept 表的唯一索引 ...

    数据结构顺序表和链表例子

    在main函数中,程序开始创建一个顺序表,并进入一个循环等待用户输入。用户可以通过输入特定的字符来选择执行插入、删除操作,或退出程序。插入时,用户需提供数据和位置;删除时,用户需提供位置。整个过程中,顺序...

    数据库概论实验范文实验九:查询优化2

    在数据库领域,查询优化是提高数据库系统性能的关键环节。实验九“查询优化2”主要探讨了如何通过不同的策略和方法来提升SQL查询的执行效率。本实验基于《数据库概论》这本书,旨在帮助学习者深入理解查询优化的概念...

    mysql数据库设计为表连接设计索引

    例如,在一个连接查询中,如果外层表的数据量远小于内层表,则采用外层表先行访问的方式会更加高效。反之,则可能导致大量不必要的内层表访问,严重影响查询速度。 下面通过一个具体的例子来进一步说明: 假设有一...

    sql查询的逻辑执行顺序

    - **执行逻辑**:通过比较指定的连接条件(`&lt;join_condition&gt;`),将符合条件的记录组合在一起,形成一个新的虚拟表(`vt2`)。 ##### 3. OUTER JOIN - **作用**:处理左连接(LEFT JOIN)、右连接(RIGHT JOIN)...

    影响sql语句查询效率的因素

    特别是在Oracle数据库中,一个高效的查询不仅能显著提高应用程序的响应速度,还能减少服务器资源的消耗,从而降低运营成本。本文将深入探讨影响SQL语句查询效率的关键因素,特别关注查询优化与LIKE语句的使用,帮助...

    Oracle SQL表连接技术详解及其应用场景

    文中解释了每种连接的工作原理、适用场景以及优缺点,通过具体示例展示了这些连接方法的实际应用,重点讨论了表连接顺序对查询效率的影响,强调了合理选择连接类型和驱动表的重要性和方法。 适合人群:具备Oracle...

    Oracle数据库3种主要表连接方式对比

    - 嵌套循环连接是一种基本的连接方法,其原理是通过将一个表中的每一行与另一个表中的所有行进行比较来找出符合条件的记录对。 - 在许多情况下,较小的表会被用作“驱动表”,即首先被处理的表。但是,实际上,即使...

Global site tag (gtag.js) - Google Analytics