Sybase ASE 15.5:使用 JDBCexecutebatch() 缓慢插入

问题描述 投票:0回答:1

我正在使用 Sybase ASE 15.5 和 JDBC 驱动程序 jconnect 4,并且在一个包含 4 亿行、列 (integer, varchar(128) 的大型表上,使用executebatch() 插入批处理大小为 +/-40 行的速度缓慢),varchar(255)),列 (1,2) 上的主键和聚集索引以及列 (2,1) 上的非聚集索引。每批约 40 行需要约 200 毫秒。缓慢与表的大小有关吗?我知道删除索引可以提高性能,但不幸的是这不是一个选择。如何提高插入速度?

注意:这是应用程序实时运行的一部分,这不是一次性迁移,因此我不会使用 bcp 工具。

编辑:我已经检查了mysql的这个答案,但不确定它是否适用于Sybase ASEhttps://stackoverflow.com/a/13504946/8315843

sql performance insert sybase sap-ase
1个回答
2
投票

插入速度慢的原因有很多,例如:

  • 每个插入语句都必须被解析/编译; ASE 15.x 优化器尝试比之前的 ASE 11/12 优化器做更多很多的工作,最终结果是编译(通常)需要更长的时间来执行
  • 批量未包装在单个事务中,因此每个插入都必须等待单独写入日志完成
  • 客户端主机和数据服务器主机之间的网络连接速度较慢
  • 有一些阻塞发生
  • 表具有需要在每次插入时检查的 FK 约束
  • 表上有一个插入触发器(明显的问题是触发器正在做什么以及执行其操作需要多长时间)

一些需要考虑的想法:加快插入速度:

  • 使用准备好的语句;第一个插入被编译成一个轻量级过程(想想“临时过程”);后续插入(使用准备好的语句)受益于无需编译
  • 确保一批插入物包裹在
    begin/commit tran
    包装纸中;这往往会推迟日志写入,直到发出
    commit tran
    为止;写入日志的次数越少,意味着等待日志写入被确认的时间就越短
  • 如果应用程序和数据服务器主机之间的网络连接(相对)较慢,请考虑使用较大的数据包大小;更少的数据包意味着更少的往返数据包处理/等待时间
  • 研究jdbc是否/如何支持批量复制库(基本上通过jdbc实现类似bcp的行为)[我不使用jdbc,所以我只是猜测这可能是可用的]

上述一些内容已包含在这些 SO 线程中:

让 ExecuteBatch 执行速度更快

使用批量 JDBC 删除和插入

使用 JDBC 进行批量插入的有效方法

© www.soinside.com 2019 - 2024. All rights reserved.