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 定义为视图、函数或存储过程(两者都需要参数),但我不确定这会如何影响性能。无论最终会变得多么复杂,将其全部保存在主查询中是否更好。

4

2 回答 2

1

如您所知,MS SQL 性能完全取决于如何生成查询执行计划以及如何缓存它以便更好地命中执行上下文线程。通过创建视图重用连接的选项是一个不错的选择,但在匹配键之前您不会获得任何优势。

重复使用的问题仍然存在;视图是最好的选择,但如果您不需要,那么在结果集中和右聚集索引会受到重用查询的影响,性能会发生巨大变化。

我的个人经验表明,通过根据需要将所有这些表加入查询中可以实现最佳性能。因为它允许您对查询进行更多控制,只需将查询修改为具有 EXISTS 语句而不是使用 JOIN(如果您不希望结果集中有这些表字段。)

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

于 2013-02-23T10:48:32.643 回答
0

我认为您的问题没有明确的答案。不同的数据库有不同的优化。我的直觉是,假设您的示例代表加入(希望)正确索引的 FK 约束,它不应该产生影响还是没有实质性影响。
通过允许 DBMS 更好地缓存视图,为经常使用的数据创建视图甚至可以提高性能。
但是,如果没有实际尝试并查看这两个选项的执行计划,我无法确定,这可能是您应该做的。

于 2013-02-23T10:23:28.877 回答