精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-23
有道理 呵呵
|
|
返回顶楼 | |
发表时间: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的性能优势这方面更明显。 |
|
返回顶楼 | |
发表时间:2007-01-23
kwang 写道 楼上的,如果你把Statement st = con.createStatement();
和PreparedStatement pst = con.prepareStatement(psql); 都写在for循环外面,应该就更能看出谁快谁慢了。我在roacle里测了一下,查询5000条数据,PreparedStatement比Statement快一倍。 我也这么测试过,结果跟你一样。但是这种方式不能代表普通的web应用常见的用法,除了代码中有批处理的情况,大部分代码(比如CRUD)都是创建一个PreparedStatement然后执行、关闭,所以可以粗略的跟循环中创建、执行、关闭相比较,而不能跟你说的创建依次再多次运行相比。 不过在另一方面说明了,如果有批处理,更应该使用PreparedStatement . |
|
返回顶楼 | |
发表时间:2007-01-23
我是使用Sybase ASE12.5测试的,跟MSSQL Server 2000差不多,都是PreparedStatement慢
|
|
返回顶楼 | |
发表时间: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; } }); |
|
返回顶楼 | |
发表时间:2007-01-23
你给出的测试例子都是执行很简单的sql, 在处理复杂的sql上面使用pre是有一些优势的.
|
|
返回顶楼 | |
发表时间:2007-01-23
PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-01-23
jamesby 写道 PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.
我也一直是这种思想,但是测试的结果确不是这样的 |
|
返回顶楼 | |
发表时间:2007-01-23
Ivan Li 写道 jamesby 写道 PrepareStatement是预编译,而Statement是解释,应该PrepareStatement对于数据库来说执行速度更快才对.
我也一直是这种思想,但是测试的结果确不是这样的 |
|
返回顶楼 | |