0 0

SQL 执行速度3

有一个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毫秒就可以搞定

这是为什么呢?
问题补充:
有一个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毫秒就可以搞定

这是为什么呢?
问题补充:
错了,不是140秒,是后面被执行的线程已经40秒左右了
问题补充:
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<String> returnList = new ArrayList<String>();
				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());
		}
	}

就是上面这个时间了

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

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

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

循环启动线程时的代码如下
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<String> returnList = new ArrayList<String>();
				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());
		}

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

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

6个答案 按时间排序 按投票排序

0 0

采纳的答案

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

具体情况具体分析

2009年11月24日 14:09
0 0

哦,我也陷入理解误区了。我觉得你的理解不错。应该是那样的

2009年11月16日 10:36
0 0

你存在理解误区啊。多线程效率高,不是说多线程中单个执行效率高,而是说整体效率。我举个例子,刚刚你这个程序如果改成是单线程的,即在一个线程中执行50次run()方法的内容,你在看看这50次的执行总时间和多线程的执行总时间谁的少呢

2009年11月13日 13:55
0 0

还是多线程的问题,楼主是不是认为当代码执行到long a = System.currentTimeMillis();   之后就会一直执行到long c = System.currentTimeMillis();   中间线程不被挂起呢?我说的是当执行run后,可能到11行,或者12行,或者13行。。。等等都可能被中断,在run()方法执行的时候都是会被其他线程抢占cpu的。这个时候被打断的线程只能等待重新获得cpu执行时间片。等待的时间也是时间。这样说可以理解不?

2009年11月13日 13:43
0 0

首先我想确认一下,你说的“后面被执行的分线程的SQL执行时间已经到了30秒以上了”,你是否确定其他29个线程都已经结束,cpu只在运行这一个线程呢?这30秒可不是单个线程占用cpu的总时间,这个时间包含了调度,线程的等待时间和运行时间。简单的说,这30秒中线程不是一直执行sql,就像龟兔赛跑中的兔子,不是乌龟。这样说你可以理解么?

2009年11月13日 13:24
0 0

这个原因是cpu线程调度的问题吧。不是sql问题。。cpu的调度策略导致了这种情况。

2009年11月13日 12:25

相关推荐

    DB2性能调优资料,解决SQL执行慢的问题

    7. **内存调优**:合理配置数据库的内存参数,如SQL_BUFFER_POOL和SORT_AREA_SIZE,可以显著提升SQL执行速度。 通过深入理解DB2的内部机制,结合上述方法,可以有效地解决SQL执行慢的问题,提升整个数据库系统的...

    提高批量SQL执行程序速度

    批量SQL执行程序的速度优化 本文将为您详细介绍如何提高批量SQL执行程序的速度,包括批量发送SQL、指定SQL条数、触发事件函数等内容。同时,我们还将讨论DataAdapter.Update(DataTable)方法的使用、SqlBulkCopy类的...

    sqljdbc4的源码包

    5. 性能优化:分析驱动如何优化SQL执行速度,如批处理、缓存复用等。 6. 协议解析:深入TDS协议,理解数据在客户端和服务器之间的传输方式。 对于想要提升数据库编程技能,或者对JDBC驱动实现感兴趣的开发者来说,...

    【MySQL数据库】一条SQL语句为什么执行这么慢?

    这会导致I/O操作增加,从而影响SQL执行速度。例如,当系统内存不足或redo log空间满时,MySQL必须停止其他操作,优先处理脏页,这会使得SQL执行变慢。 2. **还在等锁** MySQL支持多事务并发处理,当一个SQL语句...

    浅析SqlServer参数化查询[参考].pdf

    在本文中,我们将深入浅析 Sql Server 参数化查询的重要性,Dispelling 两个常见的误解,并探讨参数化查询的正确编写方式,以提高 SQL 执行速度。 错误认识 1: 参数化查询仅用于防止 SQL 注入 许多开发者认为参数...

    收获,不止SQL优化--抓住SQL的本质

    4. **存储优化**:内存管理和磁盘I/O对SQL执行速度有直接影响。书中会讨论如何配置缓存、控制块大小、利用闪回区以及选择合适的存储参数来优化性能。 5. **Oracle特有功能**:Oracle数据库提供了许多独特的功能,如...

    解剖SQL执行计划

    ### 解剖SQL Server执行计划 #### 一、执行计划概览 在深入探讨SQL Server执行计划之前,我们首先需要理解什么是执行计划以及它为何如此重要。执行计划是SQL Server优化器为查询选择的最佳运行策略。当数据库...

    TSQL_Express【批量执行SQL】批量执行sql文件工具

    7. **性能优化**:通过批量执行,减少数据库服务器的负载,提升执行速度。 使用TSQL_Express的过程大致如下: 1. **安装与配置**:下载并安装TSQL_Express,配置连接到目标数据库的参数,如服务器地址、用户名、...

    SQL 执行超长语句

    ### SQL执行超长语句详解 在数据库管理与开发过程中,编写SQL语句是必不可少的一环。有时,我们可能会遇到需要执行非常长的SQL语句的情况。这些超长语句可能由于包含大量的条件、子查询或是数据量较大等原因而变得...

    优化sql查询速度

    ### 优化 SQL 查询速度 在数据库管理与应用中,提高 SQL 查询的速度是非常重要的一个环节,它不仅能够提升系统的响应速度,还能有效降低服务器资源的消耗。以下是从标题、描述及部分给定内容中提炼出的关键知识点,...

    ORACLE SQL性能优化

    2. **优势**:这不仅显著提升了SQL执行速度,还节约了内存资源。 3. **限制**: - Oracle仅对简单的表提供高速缓存支持,对于复杂的多表连接查询则不适用。 - 共享池大小需合理配置,过大或过小都会影响性能。 4. ...

    SQL_Helper.rar_数据库类

    - **性能统计**:可能包含性能计时器,帮助开发者分析和优化SQL执行速度。 综上所述,SQL_Helper是一个强大的数据库操作工具,通过封装SQL操作,简化了开发者的代码编写,提高了开发效率。开发者只需关注业务逻辑,...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计信息来优化执行计划,但这种优化方式有时可能会导致执行计划的不正确,从而影响存储过程的执行速度。 在了解这个问题之前,我们通常认为存储...

    Oracle SQL计划管理技术在油田的应用研究.pdf

    传统的性能优化方法,如索引优化、SQL语句优化和参数调整,虽然能在一定程度上提升系统性能,但面对特定情况下的SQL执行速度缓慢问题,这些方法可能并不足够。 SPM技术的核心在于,它允许数据库系统自动选择并执行...

    批量执行SQL脚本

    例如,可以一次性提交多条INSERT语句,减少网络往返,提高执行速度。另外,合理安排执行顺序,避免在繁忙时段影响到其他用户。 8. **安全性**:确保执行脚本的用户具有适当的权限,防止过度授权。同时,敏感信息...

    Oracle_SQL.rar_oracle

    10. 性能优化:通过EXPLAIN PLAN分析查询计划,使用索引、物化视图、绑定变量等方式提高SQL执行速度。 11. PL/SQL异常处理:用`BEGIN...EXCEPTION...END`块捕获和处理运行时错误。 12. 数据库备份与恢复:Oracle...

    通过分析SQL语句的执行计划优化SQL

    ### 通过分析SQL语句的执行计划优化SQL ...通过上述分析可以看出,优化SQL执行计划不仅需要对SQL语法有深刻理解,还需要了解数据库系统的底层实现机制。只有这样,才能真正做到有针对性地优化SQL查询,提升数据库性能。

    快速掌握Informix SQL的11个使用技巧

    一、优化 SQL 执行速度 1. **利用临时表进行排序和连接** 当你需要对大量数据进行排序或连接时,可以先将数据 SELECT 到内存中的临时表,再进行后续操作。例如,将两个表的连接结果存储到临时表后再排序,可以显著...

    Oracle数据库10g:新的SQL和PLSQL功能.pptx

    PL/SQL性能的提升体现在其执行速度上,Oracle声称10g版本的PL/SQL执行速度是之前版本的两倍。这得益于编译器优化和内存管理改进,使得PL/SQL代码能够更高效地运行。 此外,Oracle10g还集成了SQL/XML,支持W3C标准,...

    SQL 提升SQL执行效率诀窍

    在SQL编程中,提升SQL执行效率是至关重要的,特别是在处理大量数据时。下面将详细解释如何根据查询逻辑执行顺序来优化SQL语句。 首先,理解SQL的逻辑执行顺序是优化的前提。按照标准的SQL解析顺序,它依次为: 1. ...

Global site tag (gtag.js) - Google Analytics