具有多个左外连接的SQL Server查询挂起

时间:2014-08-06 07:20:56

标签: sql sql-server sql-server-2008 query-tuning

我有两个表格,例如:table1和table2,如下所示 表1(id,desc) 表2(id,col1,col2 .. col10 .....)

表2中的col1到col10可以与table1中的id字段链接。

我编写了一个查询,其中包含10个table1实例(每个实例都将col1链接到table2的col10)

select t2.id, t1_1.desc, t1_2.desc,.....t1_10.desc from table2 t2
 left outer join table1 t1_1 on t1_1.id = t2.col1
 left outer join table1 t1_2 on t1_2.id = t2.col2
 left outer join table1 t1_3 on t1_3.id = t2.col3
.
.
.
  left outer join table1 t1_10 on t1_10.id = t2.col10
where t2.id ='111'

此查询位于Sp内部,当我尝试在SSMS中执行Sp时,它可以正常运行。

但是,当我的网络应用程序运行时,查询适用于少数where子句值,挂起少数。

我检查了查询的成本,并在table2中使用这10列创建了一个非聚簇索引。连接时发现成本降低到0。但是,我仍然看到查询挂起

表1有500行,表2有700行。 任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:0)

首先,你为什么要重新加入桌子10次,而不是一次加入10个谓词呢?

 left outer join table1 t1_1 on t1_1.id = t2.col1
 left outer join table1 t1_2 on t1_2.id = t2.col2
 left outer join table1 t1_3 on t1_3.id = t2.col3
.
.
.
  left outer join table1 t1_10 on t1_10.id = t2.col10

VS

 left outer join table1 t1 on t1.col1 = t2.col1 
 and t1.col2 = t2.col2
 and t1.col3 = t2.col3

只是想把它搞定,因为非常不寻常地重新加入同样的桌子10次。

就您的查询计划而言,sql server会嗅探查询中使用的第一个参数,并缓存该查询计划以供将来的查询使用。这个查询计划对于某些where子句值是一个很好的计划,对于其他where子句值可能是一个糟糕的计划,这就是为什么有时它表现良好而其他时候表现不好。如果表列中存在偏差(某些where子句值具有大量重复值),那么您可以考虑在查询中使用OPTION(RECOMPILE)来强制它在每次调用时开发新的执行计划。这有利有弊,请参阅此答案进行讨论OPTION (RECOMPILE) is Always Faster; Why?