【发布时间】:2010-12-02 19:29:43
【问题描述】:
更新:
我的错...我在这些表上有一个主键..我的意思是目前没有进一步的索引 表。我们可能会在 看到性能之后的未来,因为我们对数据的过滤器太多了 检索数据 上次我们运行数据库时,索引并没有显示出太大的改进 调音。
我有一个包含数百万条记录的 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
现在第二种方式看起来更简单,但可能更耗时......我不确定哪种方式在这里最好。任何人都可以在这里帮助或指导我..谢谢!
【问题讨论】:
-
由于 MERGE 在 SQL2005 中不可用(感谢那些对此发表评论的人),我更喜欢第一种方式。第二种方式的最坏情况可能是您拥有作为聚集索引的身份,导致每次更改至少有两次写入操作。
-
OP 说:
There is no indexing currently on he tables. We might have it in the future.和4 huge tables over millions of records。请注意,主键为您提供索引。如果你没有PK,那么我说,未来就是现在!以性能的名义,请添加一个索引,这将有助于你的where condn! -
如果删除再插入,SQL Server每次都需要修改主键索引。如果只更新,则可以单独保留索引。这是四个写入操作(删除行、删除索引条目、创建行、创建索引条目)与一个(更新行)。
标签: sql-server-2005 query-optimization