论坛首页 Java企业应用论坛

PreparedStatement真的比Statement快吗?

浏览 43631 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2007-01-23  
有道理 呵呵
0 请登录后投票
   发表时间:2007-01-23  
codeplay 写道
count大点然后Math.random()*100 换成 Math.random()*10000000结果会不会更明显?

对于prepared stmt和stmt,Oracle应该都缓存其编译后的stmt,缓存100个对它来说太易了

对这个测试来说,所有pre stmt只需要编译一个即可,而stmt只要id不同就得编译


说得有道理,我使用count=1000 ,Math.random()*1024*1024,果然结果有区别。
Oracle10g 6359 1422
PostgreSQL8.1 1219 1281
MySQL5 688 968
MSSQL2K(JTDS) 516 453
MSSQL2K(MS) 516 719

count=10000 ,Math.random()*1024*1024:
Oracle10g 59953 11937
PostgreSQL8.1 7844 8328
MySQL5 4266 5843
MSSQL2K(JTDS) 3735 2562
MSSQL2K(MS) 3125 4235


说明Oracle在PreparedStatement比Statement的性能优势这方面更明显。
0 请登录后投票
   发表时间:2007-01-23  
kwang 写道
楼上的,如果你把Statement st = con.createStatement(); 
和PreparedStatement pst = con.prepareStatement(psql); 都写在for循环外面,应该就更能看出谁快谁慢了。我在roacle里测了一下,查询5000条数据,PreparedStatement比Statement快一倍。


我也这么测试过,结果跟你一样。但是这种方式不能代表普通的web应用常见的用法,除了代码中有批处理的情况,大部分代码(比如CRUD)都是创建一个PreparedStatement然后执行、关闭,所以可以粗略的跟循环中创建、执行、关闭相比较,而不能跟你说的创建依次再多次运行相比。
不过在另一方面说明了,如果有批处理,更应该使用PreparedStatement .
0 请登录后投票
   发表时间:2007-01-23  
我是使用Sybase ASE12.5测试的,跟MSSQL Server 2000差不多,都是PreparedStatement慢
0 请登录后投票
   发表时间:2007-01-23  
dengyin2000 写道
PreparedStatement预编译应该是在数据库server端吧。是不是要close Statement 和 PreparedStatement来测试。因为如果都是使用同一个stmt的话, 就没有考虑到编译的效率了。

明白你的意思了,用ConnectionCallback写了个测试
测试结果比单个stmt慢了,但是还是比PreparedStatement快,四次的执行时间分别是
34.357
35.965
36.184
32.184
           getJdbcTemplate().execute(new ConnectionCallback(){
    		public Object doInConnection(Connection conn) throws SQLException
    		{
    			String stmtSQL = "insert into jdbc_stmt values('ivanl',2,25,";
    			for(int i = 0; i< 10000; i++)
    	    	{
    				Statement stmt = conn.createStatement(); 
    	    		logger.debug("stmt #"+i);
    	    		stmt.executeUpdate(stmtSQL+i+")");
    	    		stmt.close();
    	    	}
    			return null;
    		}
    	   });

0 请登录后投票
   发表时间:2007-01-23  
你给出的测试例子都是执行很简单的sql, 在处理复杂的sql上面使用pre是有一些优势的.
0 请登录后投票
   发表时间:2007-01-23  
PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.
0 请登录后投票
   发表时间:2007-01-23  
Ivan Li 写道
dengyin2000 写道
PreparedStatement预编译应该是在数据库server端吧。是不是要close Statement 和 PreparedStatement来测试。因为如果都是使用同一个stmt的话, 就没有考虑到编译的效率了。

明白你的意思了,用ConnectionCallback写了个测试
测试结果比单个stmt慢了,但是还是比PreparedStatement快,四次的执行时间分别是
34.357
35.965
36.184
32.184
           getJdbcTemplate().execute(new ConnectionCallback(){
    		public Object doInConnection(Connection conn) throws SQLException
    		{
    			String stmtSQL = "insert into jdbc_stmt values('ivanl',2,25,";
    			for(int i = 0; i< 10000; i++)
    	    	{
    				Statement stmt = conn.createStatement(); 
    	    		logger.debug("stmt #"+i);
    	    		stmt.executeUpdate(stmtSQL+i+")");
    	    		stmt.close();
    	    	}
    			return null;
    		}
    	   });



可能是数据库的实现不一样吧。当然还是力推使用Pre statement
0 请登录后投票
   发表时间:2007-01-23  
jamesby 写道
PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.

我也一直是这种思想,但是测试的结果确不是这样的
0 请登录后投票
   发表时间:2007-01-23  
Ivan Li 写道
jamesby 写道
PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.

我也一直是这种思想,但是测试的结果确不是这样的
感觉PrepareStatement对数据库来说性能影响小,毕竟不用解释,是不是多个线程下做测试,让数据库服务器在一定压力的情况下测试结果会不同?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics