我正在考虑在我的代码特别重的部分进行优化.它的任务是将统计数据插入表中.这些数据受到其他计划的严重影响.否则我会考虑使用SQL Bulk插入等.
所以我的问题是......
是否可以尝试插入一些数据,知道它可能(不经常)为重复行抛出SqlException?
异常的性能是否比插入前检查每一行更糟?
首先,我的建议是在正确性方面犯错,而不是速度.当你完成你的项目,并分析表明,你失去显著时间检查的行插入之前存在的,只有再优化.
其次,如果所有RDBMS中都有重复项,我认为有插入和跳过的语法,所以这首先应该不是问题.我试图避免异常作为正常应用程序流程的一部分,并将它们留给真正特殊情况.也就是说,不要依赖DB中的异常来解决代码中的逻辑问题.在您的结尾(代码)上保持尽可能多的一致性,并且让DB异常仅表示真正的错误.
在纯粹的性能级别,只需插入数据并处理错误就更快,特别是如果错误很少发生.运行选择查询以检查重复,处理该结果,然后插入(如果成功)将比插入和处理偶然错误慢得多.如果它引发异常,那么由于异常处理在大多数语言中都很慢,因此会慢一点,但处理异常的速度要比任何语言的SQL查询快很多倍.
正如Assaf所说,通常还有一种方法可以显式处理重复项,因此您可以完全避免错误.这将进一步提高性能,并允许您明确表示您以特定方式处理重复项.
是否使用存储过程取决于您 - 它可以帮助提高性能,但代价是在数据库中放入更多逻辑.这是你必须做出的决定.我对此有过不愉快的经历,但这取决于RDBMS和您正在使用的语言.