我有两个表格,例如: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行。 任何人都可以提供帮助。
答案 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?