我有两个表,例如:table1和table2如下所示表1(id, desc)表2(id, col1, col2..)col10 .....)
表2中的col1到col10可以与表1中的id字段链接
我写了一个查询,其中有10个table1实例(每个实例链接table2的col1到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时,它工作没有任何问题。
然而,当我的web应用程序运行时,查询工作为少数where子句值和挂起为少数。
我检查了查询的成本,并在表2中创建了一个包含这10列的nonclusteredindex。在连接时发现成本降低为0。然而,我仍然看到查询挂起
表1有500行,表2有700行。有谁能帮忙吗?
首先,为什么要对表进行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
与
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子句值,这个查询计划可能是一个坏的计划,这就是为什么有时它执行得很好,有时却不是。如果在表列中存在倾斜(有些地方子句值有大量重复出现的值),那么可以考虑在查询中使用OPTION(RECOMPILE)
,以强制它在每次调用时开发一个新的执行计划。这样做有利有弊,请参阅关于选项(RECOMPILE)总是更快的讨论的答案;为什么?