【问题标题】:Sybase ASE 15.5 : Slow insert with JDBC executebatch()Sybase ASE 15.5:使用 JDBC executebatch() 进行慢速插入
【发布时间】:2017-07-16 16:39:40
【问题描述】:

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

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

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

【问题讨论】:

  • 我不确定你所说的+/-40 rows+/-200ms 是什么意思(我通常认为这些是指80 行范围和400 毫秒范围......??);还是说插入 40 行需要 200 毫秒?
  • 如果我没记错的话,40 行需要 200 毫秒。我会再次检查。
  • 它需要 240 毫秒但不插入任何东西。我开了一个新问题stackoverflow.com/q/45150506/8315843
  • 缓慢仅与上面这个奇怪的问题有关。我放弃了这个问题,重新加载了一个新的转储,问题就消失了,插入时间下降到 30 毫秒。

标签: sql performance insert sybase sap-ase


【解决方案1】:

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

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

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

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

这些 SO 线程中涵盖了上述一些内容:

Getting ExecuteBatch to execute faster

JDBC Delete & Insert using batch

Efficient way to do batch INSERTS with JDBC

【讨论】:

  • 每批 +/-40 行是事务的一部分,因此它是 +/-40 addBatch() + 1 次提交
  • 已经在使用准备好的语句。没有外键,没有触发器,没有阻塞查询。
  • 您是否在连接中使用ENABLE_BULK_LOAD 选项?看看这个example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2014-08-29
  • 1970-01-01
  • 2013-05-29
  • 2020-06-27
相关资源
最近更新 更多