0

我们试图弄清楚几种方法之间的相对成本是多少。

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

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

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

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

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

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

调用delete实际上不影响任何行的语句是否会产生成本,就像添加新记录时那样?这比if exists支票更糟糕吗?

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

4

1 回答 1

1

您在这里遇到的最大性能问题是您正在为每个条目调用一个存储过程 - 无论您在该存储过程中使用DELETE/INSERT还是首先检查,您仍然会有开销600K 过程调用,600K 记录事务中的一些潜在的大部分,等等。

我强烈建议您查看表值参数。您的 C# 或任何可以将一600K 条目传递给单个存储过程的东西,一次,然后您可以执行两个基于集合的操作(伪代码):

 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);
于 2013-03-26T17:07:10.080 回答