首页 > 解决方案 > 如何优化此 SQL Server 查询

问题描述

我有以下查询,它按预期工作,但执行大约需要 3 秒。原因是大量记录。有人可以建议任何步骤以提高性能吗?

解释 :

  1. 使用 Comp id 和Default_Comp = 1
  2. 如果未找到,则忽略Default_Comp并仅根据 Comp id 检查
  3. 还是没有找到,忽略与表2的join,尝试通过Comp id获取。

我的代码:

DECLARE @Finished_Comp VARCHAR(MAX) = NULL;

SELECT @Finished_Comp = MIN(tbl2.Finished_Comp) 
FROM Table1 tbl1 
INNER JOIN Table2 tbl2 ON tbl1.Sav_ID = tbl2.Sav_ID
WHERE Comp_ID = @Comp_ID AND tbl1.Default_Comp = 1 

IF @Finished_Comp IS NULL 
BEGIN   
    SELECT @Finished_Comp = MIN(tbl2.Finished_Comp) 
    FROM Table1 tbl1 
    INNER JOIN Table2 tbl2 ON tbl1.Sav_ID = tbl2.Sav_ID 
    WHERE Comp_ID = @Comp_ID 
END

IF @Finished_Comp IS NULL  
BEGIN 
    SELECT @Finished_Comp = MIN(Finished_Comp) 
    FROM Table1 tbl1 
    WHERE Comp_ID = @Comp_ID AND @Finished_Comp != '' 
END

我尝试使用COALESCE,但它返回错误的结果Finished_Comp

标签: sql-serverstored-procedures

解决方案


你在评论里说

我坚信可以在一定程度上更改查询,这样就不需要执行多个查询。

你是对的。

SELECT @Finished_Comp = COALESCE(MIN(CASE WHEN tbl1.Default_Comp = 1 THEN tbl2.Finished_Comp END), 
                                 MIN(tbl2.Finished_Comp), 
                                 MIN(CASE WHEN tbl1.Finished_Comp <> '' THEN tbl1.Finished_Comp END))
FROM   Table1 tbl1
       LEFT JOIN Table2 tbl2
              ON tbl1.Sav_ID = tbl2.Sav_ID
WHERE  tbl1.Comp_ID = @Comp_IDV 

但充其量这只会将执行时间减少到当前的三分之一(对于需要执行所有三个查询的情况)。

您应该考虑在

  • 表格1 -Comp_ID, Sav_ID INCLUDE (Default_Comp, Finished_Comp)
  • 表 2 -Sav_ID INCLUDE (Finished_Comp)

对于可能更大的改进。


推荐阅读