【问题标题】:Should I check if a key exist before inserting or handle exception on insert?我应该在插入或处理插入异常之前检查密钥是否存在吗?
【发布时间】:2015-10-10 12:04:18
【问题描述】:

哪个操作更昂贵——在INSERT 之前发出SELECT 查询,还是在INSERT 操作期间处理异常?

例如,假设我想将一些用户请求参数如param1(主键和唯一索引)、param2param3 持久保存到数据库表中,并要求在存在重复键时显示通知已经。此外,假设它是一个实时场景,整个过程预计不会超过 500 毫秒。

为什么经常建议对三个参数执行插入语句,然后处理插入异常以迎合重复?我知道抛出异常是有代价的——数据库查询的成本是否超过抛出异常的成本?

【问题讨论】:

  • 您可以通过 A 与 B 代码示例使这个问题更加清晰。即使在修订之后,我也无法用代码来描述您要描述的内容。 “将参数保存到数据库”是什么意思?将它们插入表格中?
  • 你为什么不两者都做呢?尽可能防止异常,并尽可能处理异常,都是很好的做法。
  • 您希望多久尝试一次插入副本?表格是否正确编入索引?
  • @TabAlleman 是的,使用常规 sql INSERT INTO MyTable(col1, col2, col3) VALUES (param1, param2, param3) 插入数据库表。现在,如果表中存在 param1 的重复项,则上述操作可能会失败。先做一个SELECT col1 FROM MyTable WHERE col1='@P1',如果没有重复就插入还是直接插入并捕获异常更有效?

标签: sql sql-server exception-handling


【解决方案1】:

如果我插入 1,000,000 次并先检查然后插入,即 1,000,000 次检查并说,总共插入 957,512 次 针对数据库的 1,957,512 次操作。对于未通过初始检查的 42,488 条记录,我仍然需要向用户发送消息。

如果我插入并抛出异常,我有 1,000,000 次针对数据库的操作和 42,488 次要处理的异常。

所以做生意的第一种方式是在数据库上做更多的工作。

【讨论】:

  • 我对此表示反对,因为没有任何关于检测重复主键与处理异常的有效时间的指标,我认为这个答案没有用。我强烈希望检测重复数据的性能要高得多,因为它使用的是设计使用的数据库系统,并且异常处理非常昂贵。
  • @HLGEM 我同意过度松懈。性能比较如何?
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多