日期:2014-05-18  浏览次数:20395 次

请教关于删除记录效率的问题
关于删除记录,有两个疑惑:
1、删除前先select判断是否存在记录是不是比直接删除更有效率和规范?比如Delete from T_A where ID = 2,是不是需要手工写代码在执行这个语句前,先执行一个Select Count(*) from T_A where ID = 2判断一下是否存在该记录呢?如果存在再执行删除语句。
2、循环语句中删除很多这样的记录,使用事务,全部删除操完成后再提交,比一条一条删除提交,效率差别很大吗?
欢迎各位有经验的朋友指点一二,多谢!

------解决方案--------------------
1、删除前先select判断是否存在记录是不是比直接删除更有效率和规范?比如Delete from T_A where ID = 2,是不是需要手工写代码在执行这个语句前,先执行一个Select Count(*) from T_A where ID = 2判断一下是否存在该记录呢?如果存在再执行删除语句。
--> 直接执行删除即可,效果是一样的,省掉一次不必要的查询.

2、循环语句中删除很多这样的记录,使用事务,全部删除操完成后再提交,比一条一条删除提交,效率差别很大吗?
--> 对数据库日志和锁表的影响不同,建议不用加事务,直接一条条删即,最好是能整批删.
------解决方案--------------------
1. 为了保险你可以这样做,就和你开始抢银行钱先检查下枪啊刀啊是不是可以的就这个意思
2. 没必要加事务。直接删了
------解决方案--------------------
1、删除前先select判断是否存在记录是不是比直接删除更有效率和规范?比如Delete from T_A where ID = 2,是不是需要手工写代码在执行这个语句前,先执行一个Select Count(*) from T_A where ID = 2判断一下是否存在该记录呢?如果存在再执行删除语句。

相同条件的读取会把不在内存缓冲区内的数据从磁盘读取到内存中,运行完读取再马上运行删除语句就不用读磁盘了,所以你会感觉先读再删快,实际总时间是差不多的,先读再取还会多一次逻辑读,所以直接删除就对了。

2、循环语句中删除很多这样的记录,使用事务,全部删除操完成后再提交,比一条一条删除提交,效率差别很大吗?
不算很大。另外事务是为了保证完整性,完整性优先级大于运行效率,如果业务上有完整性要求的话,慢也这这样删。