SQL 脚本需要改进,可以使用一些技巧

Posted

技术标签:

【中文标题】SQL 脚本需要改进,可以使用一些技巧【英文标题】:SQL Script Needs improvements, Could use some tips 【发布时间】:2020-11-20 09:10:59 【问题描述】:

我最近进行了一项测试,以弄清楚如何优化此 SQL 脚本,我从未编写过脚本,并且只创建查询以获取工作中的数据。这是脚本。

表有有效的数据和连接,@GUID 已经声明并且有 NVARCHAR 值。

这是 SQL 脚本

我对此很陌生,我需要优化这个脚本,据我所知,加入查询而不是使用子查询更好。 (如果我错了请纠正我) 根据我从这个脚本的理解,它是从 2 个不同的数据库中询问信息

CUSTOMER_CARDNUMBER 和 PROFILE

我看不到这些 Fake 数据库中的信息,但这不是本次测试的一部分。

在这些数据库中,它要求提供多个信息 GENERATED_CARDNUMBER 和 CUSTOMER_CARDNUMBER 的值 = @GUID(我不完全理解)

如果 REVISION_Status = A,如果 GUID = @GUID 我理解此脚本在两个数据库中寻找的内容,它将开始更新。如果它没有找到它,它将设置一个带有日期的 REVISION_STATUS 如果查询没有找到 GUID = @GUID; (如有错误请指正)

我可以使用帮助来改进这个脚本,如何以及为什么......即使有一些小错误。

谢谢!!

IF EXISTS
(

    SELECT *
    FROM   CUSTOMER_CARDNUMBER
    WHERE  GENERATED_CARDNUMBER IN
    (
        SELECT CARDNUMBER
        FROM   Profile
        WHERE  Cardnumber IN
        (
            SELECT GENERATED_CARDNUMBER
            FROM   CUSTOMER_CARDNUMBER
            WHERE  CUSTOMER_CARDNUMBER = @GUID
        )
    )
)
BEGIN
    UPDATE GUID_ACTION
      SET  
          REVISION_STATUS = 'A', 
          REVISION_DATE_CREATED = GETDATE()
    WHERE  GUID = @GUID;
END;
ELSE
BEGIN
    UPDATE GUID_ACTION
      SET  
          REVISION_STATUS = 'F', 
          REVISION_DATE_CREATED = GETDATE()
    WHERE  GUID = @GUID;
END;


【问题讨论】:

IN 更改为JOIN 可能会提高一些速度,但实际上上面的SQL 非常简单。最后两条语句(UPDATEs)只能通过确保所需的索引位于表GUID_ACTION 上来改进。您尝试使用JOIN 的目的是什么? 或者,您也可以在一个 UPDATE 中完成所有操作,而无需 EXISTS 我的第一个想法是摆脱子查询,并对 2 个表进行联接查询。 SELECT * FROM CUSTOMER_CARDNUMBER.GENERATED_CARDNUMBER, PROFILE.CARDNUMBER INNER JOIN Profile ON CUSTOMER_CARDNUMBER.???; @Larnu 是时候停止使用那些旧式连接了;他们在 28 年前被取代! Bad Habits to Kick : Using old-style JOINs 有人可以给我看一个上面的例子吗,用更简单更好,也许更现代的方式.. 似乎无法理解,抱歉这个很新。教程显然向我展示了旧方式.. 【参考方案1】:

``更新 GUID_ACTION SET REVISION_STATUS = CASE WHEN (0

这是另一种更简洁的方式,带有子查询的查询脚本很难理解,没有表的洞察力或声明@GUID

【讨论】:

以上是关于SQL 脚本需要改进,可以使用一些技巧的主要内容,如果未能解决你的问题,请参考以下文章

VS2017一些小技巧

SQL Server 一些使用小技巧

SQL优化之SQL 进阶技巧(上)

SQL优化之SQL 进阶技巧(上)

SQL Server 一些使用小技巧

数据库大师成长日记:巧用SQL语句,小技巧解决大问题!