将具有多个联接的SQL查询拆分为较小的联接有帮助吗?
我们需要每晚在SQL Server 2008 R2上进行一些报告。计算报告需要几个小时。为了缩短时间,我们预先计算了一张桌子。该表是基于JOINining 12个很大的表(数十亿行)创建的。 直到几天前cca才花费了4个小时来计算此聚合表。我们的DBA将此大联接分成3个较小的联接(每个联接4个表)。每次都将临时结果保存到一个临时表中,该表将在下一个联接中使用。 DBA增强的结果是,聚合表是在15分钟内计算出来的。我想知道这怎么可能。DBA告诉我,这是因为服务器必须处理的数据数量较少。换句话说,在大型原始联接中,与汇总较小的联接相比,服务器必须处理更多的数据。但是,我认为优化器将通过原始的大联接有效地完成此任务,自行拆分联接并仅发送下一个联接所需的列数。 他所做的另一件事是他在一个临时表上创建了一个索引。但是,我再一次认为优化器将在需要时创建适当的哈希表,从而更好地优化计算。 我曾与我们的DBA讨论过此事,但他本人不确定是什么原因导致了处理时间的缩短。他只是提到,他不会怪服务器,因为计算如此大的数据可能不堪重负,而且优化器可能很难预测最佳的执行计划...。我了解这一点,但是我想对原因进行更多定义。 因此,问题是: 有什么可能导致重大改进? 将大联接拆分为较小联接是标准程序吗? 如果有多个较小的联接,则服务器必须处理的数据量真的减少了吗? 这是原始查询: Insert Into FinalResult_Base SELECT TC.TestCampaignContainerId, TC.CategoryId As TestCampaignCategoryId, TC.Grade, TC.TestCampaignId, T.TestSetId ,TL.TestId ,TSK.CategoryId ,TT.[TestletId] ,TL.SectionNo ,TL.Difficulty ,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) ,TQ.[QuestionId] ,TS.StudentId ,TS.ClassId ,RA.SubjectId ,TQ.[QuestionPoints] ,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then …