sql-server - 在插入之前检查主键值是否比使用 try-catch 更快?

标签 sql-server performance sql-server-2008

基本上,我有一个包含两个字段主键列(memberid、messageid)的表,并且有一个存储过程,可以将新行插入到该表中。

现在我检查带有 PK 的行是否存在,如果不存在则插入,但是我已经遇到过在检查之后和实际插入之前由不同进程插入该行的情况,所以我我正在考虑另一种方法。

出于性能原因,我不想使用事务,因此我正在考虑将 INSERT 封装到 try-catch 中并完全跳过检查。如果该行已经存在,插入将失败,但会被“catch”静音,这是可以的。

我的问题是 - 抛出错误并捕获它是一个昂贵的操作吗?

最佳答案

在 SQL 2008 上,您可以只使用 MERGE - 比您的任何一种方法都简单得多。

此外,我不同意您的观点“出于性能原因,我不想使用事务” - 您执行的每个 DML 命令无论如何都是某个事务的一部分,因此即使您没有显式打开它们,也存在事务。如果您遇到性能问题,您可以发布更多详细信息,以便获得更多性能方面的帮助。

编辑:如果您需要非常快速的插入,请不要一次插入一行。添加行集并使用 MERGE - 一次插入批量行所获得的优势应该远远超过优化添加一行的速度所获得的任何微小改进。

无论如何,与数据库相关的任何事情的理论推理通常都不够好。您确实需要进行基准测试以确定哪个更快。您所说的“不必要地查询现有线路”可能完全可以忽略不计,并且您不知道是否是这种情况,直到您在实际条件下进行了测量。

关于sql-server - 在插入之前检查主键值是否比使用 try-catch 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331461/

相关文章:

MYSQL View 与选择性能和延迟

sql - 如何检查字符串是否为空?

sql - 如何用单引号包裹我的查询输出

sql - 如何在 SQL Server 中正确分组结果

sql-server - 为什么 Entity Framework 忽略我的连接字符串?

c# - 如何根据 SQL 语法在给定元数据信息和解析树的情况下确定 SQL 语句中的列属于哪个表?

c# - 如何提高 Mono 中 winforms 应用程序的性能?

c++ - 从 istringstream 读取比 ifstream 慢

sql-server-2008 - 为多个数据库创建登录

sql 获取日期中的特定时间