几个Sybase数据库查询问题:
如果我进行连接并且有一个where子句,是否会在实际连接之前应用过滤器?换句话说,它是否比没有任何条件的加入更快?
我有一个涉及3个表的示例(下面列出了列):
A: O1,....
B: E1,E2,...
C: O1, E2, E2
所以我的加入看起来像:
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....
答案 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必须读取的数量或行数。
它可能取决于您添加联接的顺序或where子句,例如如果C中只有几行,并且您首先将其添加为表或其中,则会立即减少可能的匹配数。如果C中有数百万行,则必须阅读数百万找到匹配。
现代优化器可以重新排列您的查询以提高效率,但不要依赖它。
真正减少读取的行数是将索引添加到连接列 - 如果你在A.O1和C.O1上有一个索引,那么它可以减少读取次数的质量。