Sql 优化联接(超过2个表,其中包含筛选器)
几个Sybase数据库查询问题:Sql 优化联接(超过2个表,其中包含筛选器),sql,database,sybase,Sql,Database,Sybase,几个Sybase数据库查询问题: 如果我做一个连接并且有一个where子句,那么过滤器会在实际连接之前应用吗?换句话说,它比没有任何where条件的join快吗 我有一个涉及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中,我的连接会显著
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....
首先,应使用正确的联接语法:
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 (...)
“,”表示交叉连接,由于容易遗漏,因此容易出现问题。如果你说“fromc,A”,你的查询就会大不相同。此外,它还允许您访问外部联接,并使语句更具可读性
你的问题的答案是“是”。如果联接的表较少,查询将运行得更快。如果您在主键上进行连接,并且表适合内存,那么连接并不昂贵。但是,只在B中的记录中查找数据更快
正如我所说的,在某些数据库中可能存在一些边界情况,而这不一定是真的。例如,如果列中只有一个值,而该列是一个长字符串,则将该列添加到页面上可能会增加B所需的页面数。这种极端情况不太可能发生,您应该会看到性能改进。速度通常取决于SQL Server必须读取的行数
真正可以减少读取的行数的是向联接列添加索引-如果在A.O1和C.O1上有索引,那么它可以大量减少读取的行数。我认为我们需要进一步了解您的关系实际上代表了什么。从技术上讲,是的,如果从查询中删除
C
,您的加入s会更快。然而,如果您开始违反良好的规范化实践,这可能会适得其反(因此,这取决于您的实际情况)。不要使用隐式连接语法(逗号分隔的FROM
子句),始终明确限定您的连接
s-这是20年来的建议。一些RDBMS足够聪明,可以将这种事情转换为常规联接,但我不知道Sybase。
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 (...)