基本上,我有一个包含两个字段主键列(memberid、messageid)的表,并且有一个存储过程,可以将新行插入到该表中。
现在我检查带有 PK 的行是否存在,如果不存在则插入,但是我已经遇到过在检查之后和实际插入之前由不同进程插入该行的情况,所以我我正在考虑另一种方法。
出于性能原因,我不想使用事务,因此我正在考虑将 INSERT 封装到 try-catch 中并完全跳过检查。如果该行已经存在,插入将失败,但会被“catch”静音,这是可以的。
我的问题是 - 抛出错误并捕获它是一个昂贵的操作吗?
最佳答案
在 SQL 2008 上,您可以只使用 MERGE - 比您的任何一种方法都简单得多。
此外,我不同意您的观点“出于性能原因,我不想使用事务” - 您执行的每个 DML 命令无论如何都是某个事务的一部分,因此即使您没有显式打开它们,也存在事务。如果您遇到性能问题,您可以发布更多详细信息,以便获得更多性能方面的帮助。
编辑:如果您需要非常快速的插入,请不要一次插入一行。添加行集并使用 MERGE - 一次插入批量行所获得的优势应该远远超过优化添加一行的速度所获得的任何微小改进。
无论如何,与数据库相关的任何事情的理论推理通常都不够好。您确实需要进行基准测试以确定哪个更快。您所说的“不必要地查询现有线路”可能完全可以忽略不计,并且您不知道是否是这种情况,直到您在实际条件下进行了测量。
关于sql-server - 在插入之前检查主键值是否比使用 try-catch 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331461/