SQL查询不会停止执行

时间:2016-06-20 18:36:58

标签: sql sql-server stored-procedures

我创建了一个存储过程,它从不同dbs中的几个不同的表中选择临时表,以便在proc中使用。填写表格似乎一切都很好。当我尝试加入他们时,我的问题就出现了。这是我写的查询:

SELECT #temp1.id,
    #temp2.first_name,
    #temp2.last_name,
    #temp3.DOB,
    #temp4.Sex, 
    #temp5.SSN
FROM (((#temp1
LEFT JOIN #temp3 ON #temp1.id = #temp3.id) 
LEFT JOIN #temp4 ON #temp1.id = #temp4.id)
LEFT JOIN #temp2 ON #temp1.id = #temp2.id)
LEFT JOIN #temp5 ON #temp1.id = #temp5.id;

查询在某种程度上有效。输出窗口填充了select的结果。问题是查询不会退出。它会停止向输出添加新记录,但会继续执行,因此程序会挂起,因为它无法继续执行下一个语句。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我可以看到您的查询导致执行计划中所有5个表的高表扫描。您可以在所有5个临时表中的连接列(ID)上创建索引,如下所示:

 CREATE CLUSTERED INDEX IDX_C_t1_ID ON #temp1(ID)
 CREATE CLUSTERED INDEX IDX_C_t2_ID ON #temp2(ID)
 CREATE CLUSTERED INDEX IDX_C_t3_ID ON #temp3(ID)
 CREATE CLUSTERED INDEX IDX_C_t4_ID ON #temp4(ID)
 CREATE CLUSTERED INDEX IDX_C_t5_ID ON #temp5(ID)

如果您可以为所有5个表包含行数和列数,那将非常有用。

答案 1 :(得分:0)

#temp1中有多少条记录?您是否在输出窗口中看到相同数量的记录?如果没有,那么您的查询仍然会返回记录。

另外,您是否在脚本中的某处显式开始了事务?也许它正等着你提交或回滚。

另外,我不确定为什么你的连接有括号。它们不是必需的(也许你通过使用它们得到了一些奇怪的执行计划)。

答案 2 :(得分:0)

此查询的运行时间取决于(除此之外)#temp1中的行数以及它具有的索引(默认情况下为>什么都没有。

第一步就是我所看到的:
隔离执行计划,特别是针对此查询。您可以将数据填入temp1(而不是#temp1),

然后 - 尝试仅针对 temp1运行查询。

查看查询的执行计划,可能会建议哪些索引可能会有所帮助,并且将是优化它的第一步。