sybase批量insert 效率低 求解!!!

l344438713 2012-08-27 09:32:17


public void insertGridIndex(Jsoner query){
List<Map<String,Integer>> gridList = (List<Map<String,Integer>>)query.root().get("gridIndexRange").getArray() ;
int size = gridList.size();
long time = System.currentTimeMillis();
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try{

conn = DbUtil.getInstance().getConnection();
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.execute("if exists (select 1 from sys.SYSTABLE where table_name ='GridIndex_Range') then drop table GridIndex_Range end if");
stmt.execute("create table GridIndex_Range (intGridIndex integer)");

String sql = "insert into GridIndex_Range(intGridIndex) values (?)";
System.out.println("SQL = "+sql);
pstmt = conn.prepareStatement(sql);
int batch = 0;
for(int i=0;i<size;i++){
pstmt.setInt(1,gridList.get(i).get("id").intValue());
pstmt.addBatch();
batch++;
if(batch==2000){
pstmt.executeBatch();
conn.commit();
pstmt.clearBatch();
batch = 0;
}
}
pstmt.executeBatch();
conn.commit();
pstmt.clearBatch();

System.out.println("---------传入大小-----------:"+size);
System.out.println("-----------耗时-------------:"+(System.currentTimeMillis()-time));
}catch (SQLException ex) {
ThrowPrintUtils.throwDaoExceptionSql(ex);
} catch (Exception ex) {
ThrowPrintUtils.throwDaoException(ex);
} finally {
if(pstmt != null){
try{
pstmt.close() ;
pstmt= null;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){
try{
stmt.close() ;
stmt = null;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){
try{
conn.close() ;
conn = null;
}catch(SQLException e){
e.printStackTrace() ;
}
}
}
}


问题:现在在内存中有一批id,向一个表中插入,我按照上面的方法,2000条提交一次,3万条竟然要150秒,这个速度简直无法忍受了!!! 高手求解!!!
...全文
420 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwb344438713 2012-08-28
  • 打赏
  • 举报
回复
不满意结贴
WWWWA 2012-08-27
  • 打赏
  • 举报
回复
你将事务打开试试,什么版本、系统
l344438713 2012-08-27
  • 打赏
  • 举报
回复
表中只有一个字段 create table GridIndex_Range (intGridIndex integer)

另外在sybase中执行下面的。1万条要25秒 太慢了吧 是不是sybase的什么配置文件没配对???

declare @i int
set @i=0
while @i<10000
begin
insert into GridIndex_Range(intGridIndex) values (@i)
set @i=@i+1
end



结果
1 条记录受到影响


1 条记录受到影响


1 条记录受到影响

感觉没有批量?????
WWWWA 2012-08-27
  • 打赏
  • 举报
回复
表中有多少字段、记录,你将id保存在表中,直接插入不行?
l344438713 2012-08-27
  • 打赏
  • 举报
回复
sybase IQ
网上查了下 insert的确慢,使用 load table 较快 但是我调试下面的语句,每次都是: 0 条记录受到影响
txt中就是数字然后换行
求解!!



set temporary option CONVERSION_ERROR='OFF';
load table GridIndex_Range
(
intGridIndex 'x0a'
)
From
'E:\gridindex.txt'
ESCAPES OFF
QUOTES OFF
NOTIFY 1000000
ON FILE ERROR CONTINUE
IGNORE CONSTRAINT ALL 0
WITH CHECKPOINT OFF;
commit;
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理之三,主要讲解以下内容:1.     PostgreSQL约束讲解和剖析2.     PostgreSQL数据类型3.     PostgreSQL的结构管理4.     PostgreSQL条件表达式和操作5.     PostgreSQL使用小技巧

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧