gpt4 book ai didi

sql-server-2005 - 哪个是删除插入与 if-update else-insert 的最佳选择?

转载 作者:行者123 更新时间:2023-12-04 14:06:19 25 4
gpt4 key购买 nike

更新 :

My bad...I have an primary key on those tables..I meant no further indexing currently on the tables. We might have it in the future after seeing the performance and since we have too many filters on the data in retrieving data it did not show much improvement on indexing last time we ran database tuning.



我有一个超过数百万条记录的 4 张大表。现在有一个经常调用的存储过程并更新这些表。这是场景——

现在,如果今天存在条目,我需要为今天更新它,否则如果用户没有条目,我需要继续为用户插入一个条目。现在有两种方法可以执行这些操作,因为只有一个 proc 可以执行此操作 -

第一种方式——
IF EXISTS(TABLE1)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE2)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE3)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE4)
--UPDATE where condn
ELSE
--INSERT

第二种方式——
DELETE from TABLE1 where condn
DELETE from TABLE2 where condn
DELETE from TABLE3 where condn
DELETE from TABLE4 where condn

INSERT TABLE1 ENTRY
INSERT TABLE2 ENTRY
INSERT TABLE3 ENTRY
INSERT TABLE4 ENTRY

现在第二种方式看起来更简单,但可能更耗时……我不确定哪种方式在这里最好。任何人都可以请帮助或指导我在这里..谢谢!

最佳答案

如果您期望大部分插入,请尝试此操作

...
BEGIN TRY
INSERT table1
END TRY
BEGIN CATCH
IF ERROR_NUMBER = 2627
UPDATE table1
ELSE
--process real error
END CATCH
...

主要是更新...
...
BEGIN TRY
UPDATE table1 ... WHERE ...
IF @@ROWCOUNT = 0
INSERT Table1
END TRY
BEGIN CATCH
--optional. if someone manages to insert before here, do we update it? or just ignore it?
IF ERROR_NUMBER = 2627
UPDATE table1
ELSE
--process real error
END CATCH
...

EXISTS 在高负载下并发不够。如果你打算用 EXISTS 扫描表,你不妨试试 INSERT。

其他答案: One , Two , Three

编辑:我称之为 JFDI 模式...

关于sql-server-2005 - 哪个是删除插入与 if-update else-insert 的最佳选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338984/

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