临时表对于select语句来说太长了

时间:2014-11-04 00:29:50

标签: sql-server performance

enter image description here

问题在于: LeadsWalkIn = CASE WHEN(WORK.WORK_ID NOT IN(选择WorkId FROM #WORKSHEETS)和WORK.AGRA_ID = CU.AFFINITY_GROUP_ID)那么1 ELSE 0 END, 长期以来,我得到了时间。 有没有其他方法可以更快地获得相同的结果? 感谢

3 个答案:

答案 0 :(得分:1)

鉴于当前的#WORKSHEETS表定义(假设WorkId保证为非空),我将避免使用子查询,而是使用外部联接操作。我们需要保证匹配的行不会超过一行,因此我们可以使用DISTINCT或GROUP BY来获取WorkId的唯一列...

 LEFT JOIN ( SELECT DISTINCT WorkId FROM #WORKSHEETS ) w
   ON w.WorkId = WORK.WORK_ID 

然后更改SELECT列表中的表达式,以检查“无匹配行”条件:

   CASE WHEN w.WorkId IS NULL AND ... 

如果#WORKSHEETS表没有用于其他任何内容,我会考虑只插入WorkId的唯一值,方法是在填充#WORKSHEETS表的查询中添加GROUP BY或DISTINCT ,然后仅使用对#WORKSHEETS的引用代替内联视图查询(w)。

#WORKSHEETS上添加适当的索引可以提高联接操作的性能。如果我们只有WorkId的不同值,那甚至可能是一个独特的索引。

答案 1 :(得分:0)

在填充后,尝试在#Worksheets上创建索引,类似于:

CREATE CLUSTERED INDEX [ClusteredIndexName] ON [dbo].[#worksheets]
(
    [workid] ASC
)

可以进一步优化,但如果您将代码作为文本而不是图像发布,则会更容易。

答案 2 :(得分:0)

示例逻辑:

ex数据:

Work    xxx
-----------
A       A
B       B
x       C
x       D
E       x
F       x

如果您想获得这样的结果,请使用左连接:

if WORK.AGRA_ID = CU.AFFINITY_GROUP_ID

Work    xxx    value
--------------------
A       A      0
B       B      0
E       x      1
F       x      1

试试这个:

你的选择你想要:

LeadsWalkIn = CASE WHEN (xxx.WorkId is null AND WORK.AGRA_ID = CU.AFFINITY_GROUP_ID) THEN 1 ELSE 0 END,

并且您的加入查询会添加到上次加入:

Left Join #WORKSHEETS xxx On xxx.WorkId = WORK.WORK_ID