`
m7788
  • 浏览: 9728 次
  • 来自: ...
社区版块
存档分类
最新评论

JAVA中四种SQL执行方式性能测试

阅读更多

在这个项目中,由于一些原因没有使用orm进行数据库操作,而是使用Spring的JdbcTemplate

但在上线后发现效率很低,通过性能监视器发现SQL Compilations的比率很高,程序中大量使用动态拼SQL语句的情况

于是进行了一些性能测试

 

代码如下:

 

		Main.log("SQL四种执行方式性能比较");
		// Statement
		jt.execute("dbcc freeproccache");
		start = System.currentTimeMillis();
		sql = "select top {0} id, intStatus from tblInfo where charCityFrom=''{1}''";
		for (int i = citys.size() -1; i >= 0; i--) {
			Map c = citys.get(i);
			String city = (String) c.get("charCityFrom");
			jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
		}
		map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
		Main.log("Statement:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
		
		// PreparedStatement
		jt.execute("dbcc freeproccache");
		start = System.currentTimeMillis();
		sql = "select top {0} id, intStatus from tblInfo where charCityFrom=?";
		for (int i = citys.size() -1; i >= 0; i--) {
			Map c = citys.get(i);
			String city = (String) c.get("charCityFrom");
			jt.queryForList(MessageFormat.format(sql, i % 20 + 1), new Object[]{city});
		}
		map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
		Main.log("PreparedStatement:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
		
		// EXEC sp_executesql
		jt.execute("dbcc freeproccache");
		start = System.currentTimeMillis();
		sql = "EXEC sp_executesql N''select top {0} id, intStatus from tblInfo where charCityFrom=@cityFrom'', N''@cityFrom nvarchar(10)'', ''{1}''";
		for (int i = citys.size() -1; i >= 0; i--) {
			Map c = citys.get(i);
			String city = (String) c.get("charCityFrom");
			jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
		}
		map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
		Main.log("Sp_executesql:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
		
		// 存储过程
		jt.execute("dbcc freeproccache");
		start = System.currentTimeMillis();
		sql = "exec sp_FindInfoByCitFrom {0},''{1}''";
		for (int i = citys.size() -1; i >= 0; i--) {
			Map c = citys.get(i);
			String city = (String) c.get("charCityFrom");
			jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
		}
		map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
		Main.log("Procedure:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);

 

 得到结果(多次执行,结果相关不大):

2008-11-05 10:36:52.521 [main] - SQL四种执行方式性能比较
2008-11-05 10:36:53.365 [main] - Statement:CNT=224 TotalSize=9134080 t=829ms
2008-11-05 10:36:53.815 [main] - PreparedStatement:CNT=23 TotalSize=901120 t=450ms
2008-11-05 10:36:55.44 [main] - Sp_executesql:CNT=26 TotalSize=1351680 t=1625ms
2008-11-05 10:36:55.864 [main] - Procedure:CNT=25 TotalSize=933888 t=424ms

 

 

存储过程虽然性能最高,但维护确实有点麻烦

综合一下就我们的情况使用PreparedStatement最好,不过以前使用sql server 2000时有发现这个性能不好,看来跟生产环境还是有挺大关系

Sp_executesql的表现倒是出乎意料

 

经验主意害死人啊,就这个问题浪费了大量的时间

 

分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包101

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包7

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Java资源包01

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics