2011-09-26 66 views
0

我有一个查询在SQL Server中保持超时。查询中最大的表格只有几百行。基本上我试图将一堆表中的数据与tblNovaPosts中的novaPost字段进行匹配以创建报告。我应该如何更改此查询以使其运行速度更快?使用多个连接优化此查询

SELECT TOP (100) PERCENT tblNovaPosts.type, tblNovaPosts.novaPost, 
ISNULL(SUM(tblAuditTrail.amount), 0) AS FUNDING, 
ISNULL(SUM(tbl510.allot), 0) AS ALLOT, 
ISNULL(SUM(tblStanfin.oblig), 0) 
+ ISNULL(SUM(tblSof.obligationsCum), 0) 
+ ISNULL(SUM(tblSpecAppt.obligations), 0) 
+ ISNULL(SUM(tblJlens.obligationsCum), 0) 
- ISNULL(SUM(viewReimbObs.reimbObs), 0) AS OBLIGATED, 
ISNULL(SUM(tblSof.commitmentsNonCum), 0) 
+ ISNULL(SUM(tblRmt.commitment),0) 
+ ISNULL(SUM(tblReimb.commitmentsNonCum), 0) 
- ISNULL(SUM(viewReimbObs.reimbObs), 0) AS DIRCOMMIT 
FROM tblNovaPosts LEFT OUTER JOIN 
tblAuditTrail ON tblNovaPosts.novaPost = tblAuditTrail.novaPost LEFT OUTER JOIN 
tbl510 ON tblNovaPosts.novaPost = tbl510.novaPost LEFT OUTER JOIN 
tblStanfin ON tblNovaPosts.novaPost = tblStanfin.novaPost LEFT OUTER JOIN 
tblSof ON tblNovaPosts.novaPost = tblSof.novaPost LEFT OUTER JOIN 
tblSpecAppt ON tblNovaPosts.novaPost = tblSpecAppt.novaPost LEFT OUTER JOIN 
tblJlens ON tblNovaPosts.novaPost = tblJlens.novaPost LEFT OUTER JOIN 
viewReimbObs ON tblNovaPosts.novaPost = viewReimbObs.novaPost1 LEFT OUTER JOIN 
tblRmt on tblNovaPosts.novaPost = tblRmt.novaPost LEFT OUTER JOIN 
tblReimb ON tblNovaPosts.novaPost = tblReimb.novaPost 
GROUP BY tblNovaPosts.type, tblNovaPosts.novaPost 
ORDER BY tblNovaPosts.type, tblNovaPosts.novaPost 
+3

'TOP(100)PERCENT'没有任何意义.. – Magnus

+0

我在视图中看到它,当我想通过 –

+3

@Conrad强制执行默认命令时 - [自SQL Server 2000以来, (http://blogs.msdn.com/b/queryoptteam/archive/2006/03/24/560396.aspx) –

回答

1

查看查询计划。通常SQL Server会给你一个索引建议。

点击此按钮:

execution plan

0

有一些可疑所有的左外连接。你确定那是你需要的吗?

另外,我注意到你是外连接到一个名为tblAuditTrail的表。这似乎有可能产生2张表的笛卡尔积。

也许你应该单独测试每个连接,以检查你是不是实际请求了10万亿行而不是你期望的几百个。