关于数据库插入的效率的问题

winterlight09 2010-11-21 10:00:24
我写了个java程序,用的数据库是java自带的java db,即apache derby,这个嵌入式的数据库,功能完全可以。
我的程序是这样的,向数据表的一列中插入值,但是要求这个列的值是唯一的,所以建立表时写了unique这个关键词。
现在比如要向这一列中插入一个值A,但是不知道这个值是不是已经存在于表中了,现在有两种做法:
1,先查询这一列中是否已经存在值A,若有则不插入,若没有则插入
2,直接执行插入,如果出现插入失败(违反惟一性约束)则表示表中已经有这个值了,如果没有异常则插入成功。

我想让程序在数据库操作上不要浪费太多的CPU时间,我觉得用第2中方法效率更高(因为第一种得先查询再确定是否更新,而第二种只需执行一个更新,但是却可能抛出异常)。

但是在数据库手册上说,如果频繁出现异常的话会比较影响数据库的效率,现在我又想用第一种方法。
我想请问有经验的朋友告诉我,到底用哪种方法效率更高?如有原因则更加感谢。

...全文
181 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
林二棍子 2010-11-23
  • 打赏
  • 举报
回复
#8 的方法是不可以的。

你在建表的时候有使用UNIQUE关键字,这个列就已经建立了一个惟一索引,在这种情况下,查询是否存在是非常迅速的,不需要考虑效率问题。
caofaping 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yaoweijq 的回复:]
merge这种在这个数据库里面有么?
[/Quote]

是oracle数据库,这个可以解决!
qq7040210 2010-11-22
  • 打赏
  • 举报
回复
你的方法 1 和 2 都不可取 我给你提供第三套方案 1 查询数据库全部数据(当然如果数据超过1万条的话 可以用条件 约束),放到 hashMap中 然后 用代码比对你要插入的数据 筛选出 剩余的 唯一的部署数据 然后批量插入就可以了.这样 即判断了唯一约束 也解决了对数据库 多次操作的效率问题 同时也不会有异常抛出.
yaoweijq 2010-11-22
  • 打赏
  • 举报
回复
merge这种在这个数据库里面有么?
hardycheng 2010-11-22
  • 打赏
  • 举报
回复
我推荐第一种方式。
用存储过程就可以解决这个问题了
qunhao 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nicholas_lin 的回复:]
忘记说了,建议第一种。你到任何一家公司里面做,插入操作之前,一定会要求你检查唯一性的。
[/Quote]

就算插入之前检查了唯一性,执行的时候还是有可能违反唯一性约束呀。
winterlight09 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qq7040210 的回复:]

你的方法 1 和 2 都不可取 我给你提供第三套方案 1 查询数据库全部数据(当然如果数据超过1万条的话 可以用条件 约束),放到 hashMap中 然后 用代码比对你要插入的数据 筛选出 剩余的 唯一的部署数据 然后批量插入就可以了.这样 即判断了唯一约束 也解决了对数据库 多次操作的效率问题 同时也不会有异常抛出.
[/Quote]嗯,谢谢各位了
winterlight09 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hardycheng 的回复:]

我推荐第一种方式。
用存储过程就可以解决这个问题了
[/Quote]这个是个轻量的,没有存储过程,只有几个系统过程,很谢谢了
java_new_comer 2010-11-22
  • 打赏
  • 举报
回复
建议使用第一种。原因:
1、假如已经存在记录,在JAVA程序中,应该还有后续的异常操作处理(例如返回插入结果失败的提示语)。如果采用第二种,异常抛出后,批量插入是否要继续?如果继续,JAVA程序的逻辑处理就比较困难了。
2、一般的程序,在查询出已有记录的情况下,可能会执行另外的操作(例如执行UPDATE语句或者跳过),采用第一种方法处理比较好。
3、类似的查询是否存在记录,对于效率来说,影响不会很大的。
林二棍子 2010-11-21
  • 打赏
  • 举报
回复
忘记说了,建议第一种。你到任何一家公司里面做,插入操作之前,一定会要求你检查唯一性的。
林二棍子 2010-11-21
  • 打赏
  • 举报
回复
在设计上,应该尽量避免使用异常作为程序控制。在能够预知异常出现的情况时,应进行捕获和处理。
qunhao 2010-11-21
  • 打赏
  • 举报
回复
例如你插入1000次数据,违反惟一性约束的可能性应该不会出现很多次吧。
但是如果你用第一种的话,插入1000次你就需要判断1000次该数据是否存在的操作。

从这个效率上看,用第二种好,记得捕获异常就可以了。
Dh_Liang 2010-11-21
  • 打赏
  • 举报
回复
就这种情况来说用2nd方法效率高

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧