我在各种sql server版本上使用t-sql。
从我学习交叉申请的那一刻起,我就经常使用它。我想讨论的具体用途是使用一个
cross apply (select really_long_statement where correlated_join_condition) as tablename(fieldname)
语句。我正在使用它来使代码更清晰,正如我在这里读到的“引入新列!”部分: http://bradsruminations.blogspot.gr/2011/04/t-sql-tuesday-017-it-slices-it-dices-it.html
对我来说很明显,我提到的陈述完全相同的功能可以通过以下方式实现:
inner join (select correlated_join_condition_fields,really_long_statement) as tablename(fieldname) on correlated_join_condition
有点懒,最初我更喜欢第一个解决方案,因为我不必输入两次连接条件字段。 然后我想,交叉应用是不太知道并使用内部连接,所以为了更容易维护代码,可能坚持内部连接是个好主意。 但后来,我查看了这两个场景的实例的查询计划,并注意到交叉应用实际上更快!!我没想到这个;从我读过的关于计划的所有帖子来看,似乎大部分时间,当两个查询做同样的事情并且没有太大的不同时,计划分析器会计算出这个并制定相同的计划。
我在撰写本文时无法上传计划,但我可以在几天内完成。
所以,问题是,为什么交叉应用似乎更快?是因为它不必使连接条件字段可用吗?
此外,欢迎任何关于性能平衡/易于阅读的代码/简写代码的意见。