优化连接(超过2个表,其中过滤器)

时间:2012-08-15 14:55:03

标签: sql database sybase

几个Sybase数据库查询问题:

  1. 如果我进行连接并且有一个where子句,是否会在实际连接之前应用过滤器?换句话说,它是否比没有任何条件的加入更快?

  2. 我有一个涉及3个表的示例(下面列出了列):

    A: O1,....
    B: E1,E2,...
    C: O1, E2, E2
    
  3. 所以我的加入看起来像:

    select A.*, B* from B,C,A
    where 
    C.E1=B.E1 and C.E2=B.E2 and C.O1=A.O1 
    and A.O2 in (...)
    and B.E3 in (...)
    

    如果我取消了C并将O1添加到表B中,我的连接会明显加快吗?

    B:E1,E2,O1....
    

2 个答案:

答案 0 :(得分:0)

首先,您应该使用正确的连接语法:

select A.*, B.*
from B join C
     on C.E1=B.E1 and C.E2=B.E2 join
     A
     on C.O1=A.O1
where B.E3 in (...)

“,”表示交叉连接,因为很容易错过,所以很容易出现问题。如果你说“来自B C,A”,你的查询就会大不相同。此外,它还允许您访问外连接,并使语句更具可读性。

你的问题的答案是“是”。如果加入的表较少,您的查询将运行得更快。如果您正在对主键进行连接,并且表适合内存,那么连接并不昂贵。但是,在B中找到记录中的数据仍然更快。

正如我所说,在某些数据库中可能存在一些边界情况,这不一定是真的。例如,如果列中只有一个值,并且列是长字符串,那么将列添加到页面上可能会增加B所需的页数。这种极端情况不太可能发生,您应该看到性能改进。

答案 1 :(得分:0)

速度通常取决于SQL Server必须读取的数量或行数。

  1. 我认为使用where子句或join
  2. 并没有任何区别
  3. 取决于已消除的表中有多少行
  4. 它可能取决于您添加联接的顺序或where子句,例如如果C中只有几行,并且您首先将其添加为表或其中,则会立即减少可能的匹配数。如果C中有数百万行,则必须阅读数百万找到匹配。

    现代优化器可以重新排列您的查询以提高效率,但不要依赖它。

    真正减少读取的行数是将索引添加到连接列 - 如果你在A.O1和C.O1上有一个索引,那么它可以减少读取次数的质量。