我创建了一个存储过程,它从不同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的结果。问题是查询不会退出。它会停止向输出添加新记录,但会继续执行,因此程序会挂起,因为它无法继续执行下一个语句。有什么想法吗?
答案 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
运行查询。
查看查询的执行计划,可能会建议哪些索引可能会有所帮助,并且将是优化它的第一步。