Sql server 对于select语句,临时表花费的时间太长
问题在于: LeadsWalkIn=当WORK.WORK\u ID不在工作表中时,从worksheet和WORK.AGRA\u ID=CU.AFFINITY\u GROUP\u ID中选择WorkId,然后1或0结束, 我花了很长时间才抽出时间。 有没有其他方法可以更快地获得相同的结果?Sql server 对于select语句,临时表花费的时间太长,sql-server,performance,Sql Server,Performance,问题在于: LeadsWalkIn=当WORK.WORK\u ID不在工作表中时,从worksheet和WORK.AGRA\u ID=CU.AFFINITY\u GROUP\u ID中选择WorkId,然后1或0结束, 我花了很长时间才抽出时间。 有没有其他方法可以更快地获得相同的结果? 谢谢请在填充工作表后尝试在工作表上创建索引,类似于: CREATE CLUSTERED INDEX [ClusteredIndexName] ON [dbo].[#worksheets] ( [work
谢谢请在填充工作表后尝试在工作表上创建索引,类似于:
CREATE CLUSTERED INDEX [ClusteredIndexName] ON [dbo].[#worksheets]
(
[workid] ASC
)
进一步的优化是可能的,但如果您将代码作为文本而不是图像发布,则会更加容易。鉴于当前的工作表表定义,假设WorkId保证为非空,我将避免使用子查询,而改为使用外部联接操作。我们需要保证匹配的行不会超过一行,这样我们就可以使用DISTINCT或GROUP BY来获得工作ID的唯一列表
LEFT JOIN ( SELECT DISTINCT WorkId FROM #WORKSHEETS ) w
ON w.WorkId = WORK.WORK_ID
然后更改“选择”列表中的表达式,以检查是否存在不匹配的行条件:
CASE WHEN w.WorkId IS NULL AND ...
如果工作表不被用于其他任何东西,我会考虑只插入工作ID的唯一值,通过添加一个组或不同于填充工作表表的查询,然后只使用工作表的引用代替内联视图查询W.p> 在工作表上添加适当的索引可以提高联接操作的性能。如果我们只有WorkId的不同值,那么它甚至可能是唯一的索引
示例逻辑: 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
对不起,图像不是很清晰。您可以保存图像,这样就可以了。不要将代码作为图像发布。请将其复制并粘贴为文本。建议的SQL更改假设WorkId在工作表中是唯一的,这可能是一个有效的假设,但我们没有足够的信息知道这实际上是有保证的。我还认为连接谓词需要比较WorkId和WORK.WORK\u ID,而不是WORK.AGRA\u ID。非常感谢。这工作做得很好。