2012-03-30 57 views
1

当创建报告,我发现自己经常加入到广告典当子查询是这样的:与加入到广告典当子查询性能的担忧

SELECT * FROM Customer c 
JOIN (SELECT CustomerId,ContractId FROM Contract WHERE StartDate > GetDate()) co ON co.CustomerId = c.CustomerId 

显然,这仅仅是一个入住演示SQL,但它说明了点。 我想知道这些类型的查询是否有一些性能问题。还有其他好的选择吗?通常情况下,子查询是与骨料等多种复杂..

我知道在这种情况下,它会更有意义,只是加入直接接触的表,但我只是想说明的总体思路,而不必提供令人费解的例子。

任何反馈将不胜感激:-) 这是一种常见的做法?

回答

1

不是迂腐,但这在技术上不是一个ad-hoc query,它将被定义为由系统的最终用户创建的查询。相反,你的例子实际上只是一个子查询。

要解决您的问题,如果您发现自己多次加入相同的子查询,应该创建一个视图,然后加入该视图。这将允许您简化代码,并在将来对任何位置的子查询进行更改。

如果您只在单个报表中使用这些子查询,并且它们之间没有任何通用的报表可以放在视图中,那么这只是编写查询的另一种方式。这并不罕见,但您可能会考虑其他方法,例如用更多的连接替换子查询 - 这可能会为您提供更好的执行计划,但这会因其他几个因素而有所不同,其中包括哪些RBDMS是为了。

+0

是的,加入其他表通常是不实际的,但因为我有时必须做聚合和其他技巧,很难用直接连接完成。我喜欢视图的想法,但通常子查询对于它们的使用是非常特定的,所以重用是非常有限的。可能是一个有名的子查询可能是一个不错的中间地带。 – TGH 2012-03-30 04:35:15