学了数据库那么久,就使用到的就只是普通的DML,很少研究索引那些,最近工作的时候需要处理16万条数据,耗时好久,实际测试麻烦,加上近来公司内对数据库索引的讨论,于是研究SQL语句优化。举例更新如下一条数据:
a091 a0901 a0902 a0903 a0904
1 1 2 3 4
主键是a091 更新语句如下:update A09 SET a0901=2,a0902=1 WHERE a0903=3 and a0904=4重复1000次 平均1条执行时间是21毫秒update A09 SET a0901=2,a0902=1 WHERE a091=(select a091 from A09 where a0903=3 and a0904=4)重复1000次 平均1条执行时间是13毫秒大概知道是主键索引起了作用,求达人解释下原理?是因为select 的where 比update 的 where 查询得快么?还有我用实际的数据测试 反而是有子查询的耗时多了,这又是为什么?(之前看到个网摘,说ORACLE会缓存执行过的SQL语句,就是说重复两条一样的语句,会快点,是否是因为这个原因?)
a091 a0901 a0902 a0903 a0904
1 1 2 3 4
主键是a091 更新语句如下:update A09 SET a0901=2,a0902=1 WHERE a0903=3 and a0904=4重复1000次 平均1条执行时间是21毫秒update A09 SET a0901=2,a0902=1 WHERE a091=(select a091 from A09 where a0903=3 and a0904=4)重复1000次 平均1条执行时间是13毫秒大概知道是主键索引起了作用,求达人解释下原理?是因为select 的where 比update 的 where 查询得快么?还有我用实际的数据测试 反而是有子查询的耗时多了,这又是为什么?(之前看到个网摘,说ORACLE会缓存执行过的SQL语句,就是说重复两条一样的语句,会快点,是否是因为这个原因?)
如果大量数据,第2条语句更慢是确定的,
原因是:第一个语句只是针对a09表进行一次全扫描,然后更新就行了。
而第二个语句,子查询要进行一次与第一个语句一样的全表扫描,而且还要进行一次索引唯一扫描。
多出读索引块的操作,如果一个唯一索引扫描进行两次I/O,那么,1000次update,将多出2000次
一致读,这样累计消耗资源就比较明显了。
用for(int i=0;i<1000;i++){
Map m = (Map)list.get(i);
//用上面的MAP,构造SQl语句
//执行SQL
}上面省了JDBC的代码,执行速度检测都是检测executeUpdate()函数的耗时