学了数据库那么久,就使用到的就只是普通的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语句,就是说重复两条一样的语句,会快点,是否是因为这个原因?)

解决方案 »

  1.   

    第二条比第一条快?不可能吧,lz是不是搞错了?set autotrace看看
      

  2.   

    一行数据update是不能说明问题的。
    如果大量数据,第2条语句更慢是确定的,
    原因是:第一个语句只是针对a09表进行一次全扫描,然后更新就行了。
    而第二个语句,子查询要进行一次与第一个语句一样的全表扫描,而且还要进行一次索引唯一扫描。
    多出读索引块的操作,如果一个唯一索引扫描进行两次I/O,那么,1000次update,将多出2000次
    一致读,这样累计消耗资源就比较明显了。
      

  3.   

    有一堆数据,大概16万条,全放在list里
    用for(int i=0;i<1000;i++){
       Map m = (Map)list.get(i);
       //用上面的MAP,构造SQl语句
       //执行SQL
    }上面省了JDBC的代码,执行速度检测都是检测executeUpdate()函数的耗时
      

  4.   

    补充下:测试是用JAVA 的JDBC 测executeUpdate()这个函数的花费时间,SQL字符串使用的是直接串 不用?的方式