Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询不会停止执行_Sql_Sql Server_Stored Procedures - Fatal编程技术网

SQL查询不会停止执行

SQL查询不会停止执行,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我创建了一个存储过程,它从不同数据库中的几个不同表中选择临时表,以便在进程中使用。摆满桌子似乎一切都很好。当我试图加入他们时,我的问题就出现了。这是我写的查询: 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)

我创建了一个存储过程,它从不同数据库中的几个不同表中选择临时表,以便在进程中使用。摆满桌子似乎一切都很好。当我试图加入他们时,我的问题就出现了。这是我写的查询:

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;
查询在一定程度上起作用。输出窗口将填充选择的结果。问题是查询没有退出。它停止向输出中添加新记录,但继续执行,因此过程挂起,因为它无法继续下一条语句。有什么想法吗?

temp1中有多少张唱片?您是否在输出窗口中看到相同数量的记录?如果不是,则查询仍将返回记录

另外,您是否在脚本中的某个地方明确开始了事务?也许它正在等待您提交或回滚


另外,我不知道为什么在连接周围有括号。它们是不需要的(也许您使用它们会得到一些奇怪的执行计划)。

我可以看到您的查询导致对执行计划中的所有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个表包含行数和列数,这将非常有用。

此查询的运行时间取决于#temp1中的行数以及它所具有的索引(默认情况下-->无)

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

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


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

尝试一次运行一个连接,并确定是否有一个特定的连接导致其挂起。您能否验证所有应该返回的记录在显示为“挂起”时是否都已返回?每个表中有多少条记录?ID在所有表上都是唯一的吗?如果存在重复项,则返回的记录数可能非常大。有了这些问题的答案,这里的人们可能会更容易帮助你。列名和类型也会有帮助。查询不退出是什么意思?如果查询未完成,则可能表明查询中存在错误。您是否查看了实际执行计划?您可以尝试的另一件事是重新编译存储过程。有时,如果数据库的数据或结构发生重大更改,则重新编译过程会更新并优化过程的查询计划以应对这些更改。这可以提高过程的处理性能。