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 非常简单。最后两条语句(UPDATE
s)只能通过确保所需的索引位于表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 脚本需要改进,可以使用一些技巧的主要内容,如果未能解决你的问题,请参考以下文章