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

时间:2017-07-16 16:39:40

标签: sql performance insert sybase sybase-ase

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

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

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

1 个答案:

答案 0 :(得分:2)

插入可能很慢的原因有很多,例如:

  • 每个insert语句都必须被解析/编译; ASE 15.x优化器试图比之前的ASE 11/12优化器做更多批次更多的工作w / net结果是编译(通常)需要更长时间才能执行
  • 批处理不包含在单个事务中,因此每个插入都必须等待单独写入日志才能完成
  • 您在客户端主机和dataserver主机之间的网络连接速度很慢
  • 有一些阻止
  • 该表具有需要针对每个插入检查的FK约束
  • 桌面上有一个插入触发器(显而易见的问题是触发器在做什么以及执行操作需要多长时间)

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

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

上述部分内容包含在这些SO主题中:

Getting ExecuteBatch to execute faster

JDBC Delete & Insert using batch

Efficient way to do batch INSERTS with JDBC