我有一个内部联接,像这样:
select
* /*I define explicit columns*/
from
sometable p
innerjoin relatedtable t on
t.sometablekey = p.sometablekey
or t.sometablekey_2 = p.sometablekey--with this one, it runs a lot faster
where
/*some where clauses, on both tables*/
在连接中没有“或条件”,它运行得更慢(实际上 - 这么慢,我没有等待结果)。
目前t.sometablekey和t.sometablekey_2都没有任何索引(目前正在构建那些,不知道是否有帮助)。
所以 - 我的问题......怎么可能,查询运行速度快得多?优化器是否会疯狂并选择一些真正糟糕的查询策略?
我只是无法绕过它嘿嘿;)
此致
Johannes Colmsee
PS:那些指数现在已经完成了......现在......如果我排除“或条件”,它会以相同的速度运行......(实际上是没有或者现在快一点的那个,正如预期的那样。我做的实际查询 - 没有行满足“或条件”btw。)
P.P.S:
问题第2部分:我介绍了那些“sometablekey”和“sometablekey_2”,以提高性能。 在加入之前是这样的:
inner join relatedtable t on
t.propa = p.propa
and t.propb = p.propb
and t.propc = p.propb
or
(
t.propd_1 = p.propd
or
t.propd_2 = p.propd
)
我期待获得巨大的性能提升,但只有20%。 可能是,新的“真正的FK”关系并不是那么快,因为我们使用 varchar(40)作为键字段(这有点次优,当你应该使用一些数字类型或guid)。
P.P.S:查询计划从来没有提到任何缺失索引btw,尽管 - 它是有益的,因为评论者已经说过并且我自己的观察证明了。 (在开始这篇文章时已经建立了指数)