gpt4 book ai didi

sql-server - 对于多行最高效(快速)的 T-SQL 删除?

转载 作者:行者123 更新时间:2023-12-02 21:26:43 25 4
gpt4 key购买 nike

我们的服务器应用程序全天以每秒 1000-2000 行的速度接收有关要添加到数据库的行的信息。表中有两个互斥的列,它们唯一地标识一行:一个是称为“tag”的数字标识符,另一个是称为“longTag”的 50 个字符的字符串。一行可以有一个 tag 或一个 longTag;两者都不是。

从套接字传入的每一行可能已存在于表中,也可能尚未存在。如果存在,则必须使用新信息更新该行。如果不存在,则必须添加。我们使用的是 SQL 2005,在少数情况下甚至使用 SQL 2000,因此我们不能使用新的 MERGE 关键字。

我现在这样做的方法是构建一个巨大的 DELETE 语句,如下所示:

DELETE from MyRecords
WHERE tag = 1
OR tag = 2
OR longTag = 'LongTag1'
OR tag = 555

...其中每个传入行都有自己的“OR tag = n”或“OR longTag = 'x'”子句。

然后,我使用 ISQLXMLBulkLoad 执行 XML 批量加载,一次性加载所有新记录。

巨大的 DELETE 语句有时会超时,花费 30 秒或更长时间。我不知道为什么。

当记录从套接字传入时,它们必须被插入或替换现有的行。我这样做的方式是最好的方式吗?

编辑:新行与替换行的比率将非常倾向于新行。在我看到的来自生产的数据中,每次更正通常会产生 100-1000 个新行。

编辑2:插入和删除都必须作为单个事务处理。如果插入或删除失败,则必须回滚它们,使表处于插入和删除开始之前的相同状态。

编辑3:关于NULL标签。我需要首先简要描述一下该系统。这是交易系统的数据库。 MyTable 是一个包含两种交易的交易表:所谓的“日内交易”和所谓的“开仓头寸”。日内交易就是简单的交易——如果您是期权交易者并且进行了交易,那么该交易将是该系统中的日内交易。未平仓头寸基本上是迄今为止您的投资组合的摘要。未平仓头寸和当日交易都存储在同一个表中。日间交易有标签(长标签或数字标签),而开仓则没有。开仓可以有重复的行——这是正常的。但当日交易不能有重复的行。如果当日交易的标签与数据库中已有的某些记录相同,则表中的数据将替换为新数据。

因此 tag 和 longTag 中的值有 4 种可能:

1) 标签非零且 longTag 为空:这是带有数字标识符的当日交易。2) tag 为零且 longTag 具有非空字符值。这是带有字母数字标识符的日内交易。3) tag 为零且 longTag 为空:这是一个开仓位置。4) tag 非零且 longTag 具有非空字符值。我们的服务器软件可以防止这种情况发生,但如果发生这种情况,longTag 将被忽略,并且将被视为与情况 #1 相同。再说一遍,这不会发生。

最佳答案

我认为将巨大的 DELETE 语句分成 2 个 DELETE 可能会有所帮助。

1 个 DELETE 处理 tag,一个单独的 DELETE 处理 longTag。这将有助于 SQL Server 选择有效地使用索引。

当然,您仍然可以在 1 个数据库往返中触发 2 个 DELETE 语句。

希望这有帮助

关于sql-server - 对于多行最高效(快速)的 T-SQL 删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/714590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com