DELETE / INSERT呼叫对的相对成本与“if exists”检查预先相关?

时间:2013-03-26 16:57:15

标签: sql-server-2008

我们试图找出几种方法之间的相对成本。

我们有一个网页,用户可以选择在表格中添加/保留/删除行,方法是用复选框标记它们。 (人们可以在页面中添加新条目以及查看现有条目。)

当发布到Web服务器时,页面循环遍历条目并调用存储过程,将复选框的状态作为参数之一传递。

存储过程当前为每个条目调用delete语句,如果标记了复选框,则后跟insert。这具有简单的优点。

我们正在考虑而不是在那里放置一些if exists逻辑,以测试该行是否已经在表中。

如果是,并且标记了复选框,我们就不管它了。否则我们会插入它。相反,如果该行不在表格中并且复选框未标记,我们将跳过deleteinsert语句。这最大限度地减少了deletes这样的数量,但代价是更多的逻辑。

就数据库的负载而言,一种方法通常优先于另一种方法吗?

调用delete语句是否会产生成本,实际上这些语句不会影响任何行,就像添加新记录时一样?这比if exists检查还要糟糕吗?

该表在所有相关列上编制索引。我假设发布600,000个条目,预先检查会有很大的优势,但有问题的页面最多只能有100个条目。

1 个答案:

答案 0 :(得分:1)

你在这里遇到性能的最大问题是你正在为每个条目调用一个存储过程 - 如果在你使用DELETE/INSERT的存储过程中或者首先检查你真的没关系仍然会有600K过程调用的开销,600K记录事务的一些潜在大部分等等。

我强烈建议您查看table-valued parameters。您的C#或其他任何可以将 set 的600K条目传递给单个存储过程一次,然后您可以执行两个基于集合的操作(伪代码):< / p>

 UPDATE src SET val = t.val
   FROM dbo.tvp INNER JOIN dbo.source AS src
   ON t.key = src.key;

 INSERT src SELECT x FROM dbo.tvp AS t
   WHERE NOT EXISTS (SELECT 1 FROM src WHERE key = t.key);