gpt4 book ai didi

sql - 如何有效地检查数据库是否包含与挂起插入相同的记录?

转载 作者:行者123 更新时间:2023-12-04 05:57:53 25 4
gpt4 key购买 nike

我有一些记录要通过存储过程“插入或更新”到 SQL Server 数据库中。这些记录有一个全局唯一且稳定的 ID,以及一堆值属性(大约十几个)。

检查插入非常简单 - 查看表中是否不存在键。

假设该键确实存在,那么我需要检查现有记录是否包含与我传递到过程中的当前数据完全相同的值。目前我正在通过以下方式执行此操作:

SELECT @identical = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END FROM Table
WHERE idCol = @newId
AND valueCol1 = @newValue1
AND valueCol2 = @newValue2
AND ...

这有效,但效率不高;我每秒可以插入大约 70 条记录,这比我预期的要慢得多。

我的第一个想法是添加一个索引 - 但这将索引表中的几乎每一列。这甚至有意义还是只是表格的第二个副本? (如果相关,ID 列是一个聚集的 PK。)

是否有任何明智的方法来加速必须检查每一列的值的查询?我正在考虑使用某种散列来检测重复项,但这会增加一些空间开销、sprocs 的复杂性和误报的小(可接受)可能性,所以我更愿意基于索引或重写 SQL 的解决方案,如果一个存在。

最佳答案

不要事先测试,只需让 where 子句为您完成工作。伪代码(您的语法可能会有所不同)

UPDATE thetable
SET valueCol1 = @newValue1
, valueCol2 = @newValue2
, ...
WHERE idCol = @newId
AND (valueCol1 <> @newValue1
OR valueCol2 <> @newValue2
OR ...
);

IF (ROWCOUNT > 0) RETURN;

INSERT INTO thetable (idCol, valueCol1, valueCol2, ...)
VALUES (@newId, @newValue1, @newValue2, ... )
WHERE NOT EXISTS ( SELECT * FROM thetable nx
WHERE nx.idCol = @newId
);

关于sql - 如何有效地检查数据库是否包含与挂起插入相同的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296406/

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