我发布了我的搜索的简化版本,基本上连接了 SQL 2008
中的多个表格select * from t1
inner join t2 on t1.id = t2.id
inner join t3 on t2.id = t3.id
inner join t4 on t3.id = t4.id
inner join t5 on t4.id = t5.id
我想知道是否有办法将此查询的一部分存储为对象。不是结果,而是查询逻辑。
假设我想重复使用
inner join t3 on t2.id = t3.id
inner join t4 on t3.id = t4.id
inner join t5 on t4.id = t5.id
在不同的查询中,例如
select * from t1
inner join t2 on t1.id = t2.id
inner join t_stored on t_stored.id = t3.id
我在考虑将t_stored定义为视图,函数或存储过程(都期望参数),但我不确定如何影响性能。 最好将它全部保存在主查询中,无论它最终会有多复杂。
答案 0 :(得分:1)
如您所知,MS SQL性能完全基于查询执行计划的生成方式以及缓存方式,以便更好地执行上下文线程。通过创建视图重用连接的选项是一个不错的选择,但在匹配键之前,您将无法获得任何优势。
仍然存在重用问题;视图是最佳选择,但如果您不需要在结果集中,并且右聚集索引被重用查询命中,则性能会有很大差异。
我的个人经验表明,通过在需要时将所有这些表加入查询中可以实现最佳性能。因为它允许您获得对查询的更多控制,只需修改查询以获得EXISTS语句而不是使用JOIN(如果您不期望结果集中的那些表字段。)
通过查看此http://msdn.microsoft.com/en-us/library/ee343986(v=sql.100).aspx
了解如何缓存计划答案 1 :(得分:0)
我认为你的问题没有明确的答案。不同的数据库有不同的优化。我的直觉,假设你的例子表示加入(希望)正确索引的FK约束,它是不应该有所不同或不是实质性的。
通过允许DBMS更好地缓存视图,创建常用数据的视图甚至可以提高性能
然而,如果没有实际尝试并查看两个选项的执行计划,我无法确定,这是你应该做的。