2013-02-23 52 views
1

我张贴我的搜索的简化版本,在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定义为一个视图,或者函数或存储过程中(包括预期一个参数),但我不确定这会如何影响性能。 不管最终结果如何复杂,将它全部保存在主查询中会更好吗?

回答

1

如你所知MS SQL性能纯粹是基于查询执行计划被如何产生的,它如何被缓存为执行上下文线程更好的打击。通过创建视图来重复使用连接的选项是一个不错的选择,但在键匹配前您不会获得任何优势。

重用的问题仍然存在;视图是最好的选择,但是如果您不需要结果集并且右聚簇索引受到重用查询的影响,则性能会发生显着变化。

我个人的经验表明,最佳的性能是通过具有所有这些表需要在查询中加入来实现的。因为它允许你获得对查询的更多控制,只需通过修改查询来使EXISTS语句比使用JOINs(如果你不期望在结果集中使用这些表字段)。

看看如何通过查看计划缓存这http://msdn.microsoft.com/en-us/library/ee343986(v=sql.100).aspx

0

我不认为这是一个明确的回答你的问题。不同的数据库有不同的优化。我的直觉是,假设你的例子代表加入(希望)正确索引的FK限制,它应该没有区别或者不是实质性的。
通过允许DBMS更好地缓存视图,为常用数据创建视图甚至可以提高性能。
但是实际上没有想出来,看着这两个选项我不能肯定的执行计划,这是你应该做的可能。

相关问题