2011-09-08 43 views
1

我有一个需要4分钟的报告查询,并且在我们的最大允许限制下应用了30秒。我应该使用临时表吗?

我注意到它有很多内部连接。其中一个,我看,它是加入到一个Person表格中,该表格有数百万行。我想知道如果分解查询会更有效率。这样做效率会更高:

假设所有密钥都已编入索引。 表C有800万条记录,表B有600万条记录,表A有40万条记录。

SELECT Fields 
FROM TableA A 
INNER JOIN TableB B 
ON b.key = a.key 
INNER JOIN Table C 
ON C.key = b.CKey 
WHERE A.id = AnInput 

或者

SELECT * 
INTO TempTableC 
FROM TableC 
WHERE id = AnInput 

- TempTableC现在有1000条记录 然后

SELECT Fields 
FROM TableA A 
INNER JOIN TableB B --Maybe put this into a filtered temp table? 
ON b.key = a.key 
INNER JOIN TempTableC c 
ON c.AField = b.aField 
WHERE a.id = AnInput 

基本上,带来的结果集到临时表,然后再加入。

+4

如果可能,请发布缓慢查询的执行计划。 – Tony

+1

6-8百万条记录不是那么大,并且不会在正确编制索引的表上造成问题。我经常处理4亿个记录表,这些记录表对查询来说表现很好。 – Jamiec

+0

提供的执行计划将提供洞察实际性能开销发生的位置,以及验证正确的索引使用情况。请分享。 –

回答

3

如果您的Person表正确索引,那么INNER JOIN不应该导致这样的问题。检查您是否在所有表中加入的列上创建了索引。对于似乎是一个相对简单的查询,使用临时表似乎是在数据库设计不完善的问题上进行讨论。

正如其他人所说,唯一确定的方法是发布您的查询计划。

+0

您可以通过获取查询计划来做到这一点。 –

+0

它归结为一个非常愚蠢的子查询,这是每行的运行....感谢您的帮助。 – Craig