我的google-fu和so-fu在这里没有,所以我也可以问.
我有很多查询,其中有多个连接.
在一个查询中,我一起加入标题/项目/细节,以及查找这些记录的各种信息.
加入时,我尽量保持事物的顺序如何相关.例如:我的标题有两个查询表,所以我加入到我的项目表之前加入.
那是对的吗?
在查找表之前加入更大的表格是否更好?或相反亦然?
加入小表时应该使用循环提示,加入公开内容时是否使用合并提示?
我确定答案是“依赖”,但是一些有效和高效地加入的一般准则将是非常有帮助的.谢谢!
解决方法
编辑:根据您的问题(和Kirk Woll的)评论,您应该明白
order of your joins is aesthetic,and does not directly impact the resulting execution plan.查询优化器将以最有效的顺序执行连接,并且在绝大多数时间内使用适当的连接操作,而无需任何提示.
当你的连接命令的美学方面,这是一个主观的,但我会说,加入你的表在一起,无论什么顺序,当阅读查询时,逻辑意义…如果你开始一个@HeaderId,从那个表开始,然后JOIN给孩子表:
FROM Header h JOIN Items i ON h.HeaderId = i.HeaderId JOIN Details d ON i.ItemId = d.ItemId WHERE h.HeaderId = @HeaderId
但是,如果您使用@DetailId开始查询,我将以相反的顺序加入.
FROM Details d JOIN Items i ON d.ItemId = i.ItemId JOIN Header h ON i.HeaderId = h.HeaderId WHERE d.DetailId = @DetailId
然而,这是主观的,只是我个人的喜好.
当您开始包含OUTER JOIN …时,它变得不太主观…尝试构造您的查询以避免任何RIGHT OUTER JOIN,而使用LEFT OUTER JOIN.
默认情况下不要使用连接提示…实际上你几乎不会使用它们.查询优化器在选择最佳执行计划方面做得很好.我只遇到一个实例,我需要提供一个改进计划的连接提示…它在当时正在运行查询的服务器上大幅度地帮助,但是当数据库迁移到其他服务器时,我的加入提示破坏了查询的性能.所以,要重申,提供连接提示通常是一个坏主意.