sizhefang 2009-11-13 11:53
浏览 277
已采纳

SQL 执行速度

有一个SQL单独执行1.8秒(从库里面取数1.2秒,往java的list里面放0.6秒)
※主要从两个表查询,每个表20万的数据量,查询结果集是1.1万 SQL逻辑有点复杂,将近180行

用java写测试,简单循环这个SQL,每次循环执行的时间和单次执行的时候差不多,到后面基本上每次执行速度都在提高一点

用java循环启动N个线程,每个线程干的事情就是执行一次SQL,在这种情况下,循环30次的话,大部分线程的SQL执行时间已经到了140秒以上了。

select 1 from dual
这样的sql,循环启动50个线程,最后面的线程执行是开始执行的六倍
而且启动的第一个线程,这样的sql都要执行1秒
单独执行的时候15毫秒就可以搞定

这是为什么呢? :oops:
[b]问题补充:[/b]
有一个SQL单独执行1.8秒(从库里面取数1.2秒,往java的list里面放0.6秒)
※主要从两个表查询,每个表20万的数据量,查询结果集是1.1万 SQL逻辑有点复杂,将近180行

用java写测试,简单循环这个SQL,每次循环执行的时间和单次执行的时候差不多,到后面基本上每次执行速度都在提高一点

用java循环启动N个线程,每个线程干的事情就是执行一次SQL,在这种情况下,循环30次的话,后面被执行的分线程的SQL执行时间已经到了30秒以上了。

select 1 from dual
这样的sql,循环启动50个线程,最后面的线程执行是开始执行的六倍
而且启动的第一个线程,这样的sql都要执行1秒
单独执行的时候15毫秒就可以搞定

这是为什么呢? :oops:
[b]问题补充:[/b]
错了,不是140秒,是后面被执行的线程已经40秒左右了 :oops:
[b]问题补充:[/b]
[code="java"]
R r = new R();
for(int i=0;i<50;i++){
Thread t = new Thread(r);
t.start();
}

public void run() {
try {
long a = System.currentTimeMillis();
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@172.23.9.150:1521:cleanperformance";
String userName = "cleanperformance";
String passWord = "cleanperformance";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, userName, passWord);
String sql = "select 1 from dual";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
List returnList = new ArrayList();
while (rs.next()) {
returnList.add(rs.getString(1));
}
rs.close();
pstmt.close();
conn.close();
long c = System.currentTimeMillis();
System.out.println("++++" + Thread.currentThread().getId()+":"+(c - a));

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

[/code]
就是上面这个时间了

[b]问题补充:[/b]
挂起时间当然是有啊!
但是我通常认为多线程的程序执行效率应该是高的。
现在多线程里面每个线程处理的时间居然比普通循环里面每次循环执行的时间
高出几个数量级,那要多线程还有什么意义吗?

[b]问题补充:[/b]
简单循环2000次,耗时间222763

循环启动2000个线程 耗时间214142

循环启动线程时的代码如下
[code="java"]
public class DbTest {

public static List tmpList = new ArrayList();
public static long _TM = 0;

public static void main(String[] args) throws Exception {

    long startTime = System.currentTimeMillis();
    R r = new R();
    for(int i=0;i<2000;i++){
        Thread t = new Thread(r);
        t.start();
    }
    long endTime = System.currentTimeMillis();
    Thread.sleep(232763);
    System.out.println("$$$$$$$$$"+(_TM-startTime));        
}

}
public void run() {
try {
long a = System.currentTimeMillis();
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@172.23.9.155:1521:MANIFESTO";
String userName = "MANIFESTO";
String passWord = "MANIFESTO";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, userName, passWord);
String sql = "select 1 from dual";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
List returnList = new ArrayList();
while (rs.next()) {
returnList.add(rs.getString(1));
}
rs.close();
pstmt.close();
conn.close();
DbTest.tmpList.add("aaa");
if (DbTest.tmpList.size() == 2000) {
DbTest._TM = System.currentTimeMillis();
}
long c = System.currentTimeMillis();
System.out.println("++++" + Thread.currentThread().getId()+":"+(c - a));

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

[/code]
[b]问题补充:[/b]
感觉单CPU情况下,多线程程序的执行效率没有太大提高
[b]问题补充:[/b]
两千次差这么点时间,我觉得可以忽略不计了. :lol:  

一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片

  • 写回答

6条回答 默认 最新

  • wanghaolovezlq 2009-11-24 14:09
    关注

    多线程也要在多cpu的情况下才有更好的性能啊,不然就线程之间的切换和调度的时间就比单线程要多了多了,

    具体情况具体分析

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题