如何在 Sybase 中执行批量插入 SQL

How to perform a Bulk Insert in Sybase SQL

我需要插入大量数据(数百万)并且需要快速执行。 我在 .NET 上阅读了有关通过 ODBC 批量插入的信息,JAVA 但我需要直接在数据库上执行它。

我也读过有关批量插入的内容,但我尝试过的方法似乎没有用 Batch Insert, Example

我正在执行 INSERT SELECT,但每行大约需要 0,360 秒,这非常慢,我需要在此处进行一些改进。

如果可能的话,我将非常感谢此处提供的示例和文档指导。

数据库:SYBASE ASE 15.7

扩展一些评论...

  • 阻塞、慢速磁盘 IO 和任何其他 'wait' 事件(即除实际 insert/update activity 以外的任何事件)都可以从 master..monProcessWaits table (where SPID = spid_of_your_insert_update_process) [参见监控表的 P&T 手册(又名 MDA tables)]
  • master..monProcessObjectmaster..monProcessStatement 将为 当前 运行 查询显示 logical/physical IOs [再次,请参阅MDA 的 P&T 手册 tables]
  • master..monSysStatement 将为 最近 完成的查询显示 logical/physical IOs [再次,请参阅 MDA tables 的 P&T 手册]
  • 对于 UPDATE 语句,您需要查看查询计划,看看您是否遇到连接顺序不佳的问题;同样重要的是...... direct (fast/good) 更新与 deferred (slow/bad) 更新; deferred 发生更新的原因有很多……有些可以修复,有些则不能……更新索引列、糟糕的连接顺序、导致页面拆分的更新 and/or 行转发
  • RI(PK/FK)约束可以用sp_helpconstraint table_name查看;查询计划还将显示在 inserts/updates/deletes
  • 期间执行 RI (PK/FK) 验证时所需的隐藏连接
  • 触发器有点难以定位(官方 sp_helptrigger 直到 ASE 16 才出现);检查 sysobjects.[ins|upd|del]trig where name = your_table - 这些代表 table 上任何 insert/update/删除触发器的对象 ID;还要检查 sysobjects 记录,其中 type = 'TR' and deltrig = object_id(your_table) - 提供对额外 insert/update/删除触发器的支持(如果这只是 ASE 16+,暂时不记得)
  • 如果触发器被触发,需要检查相关的查询计划以确保 inserteddeleted tables(如果引用)正在驱动这些伪的任何查询tables 与永久 tables
  • 合并

可能有一些地方我忘记了(不在我的脑海中)……关键是 'slow' DML 语句可能有很多原因。


一种(相对)快速的方法来查明 RI (PK/FK) 约束或触发器是否在起作用...

set showplan on
go
insert/update/delete statements
go

然后查看生成的查询计划;如果您看到对 insert/update/delete 语句中明确列出的引用以外的任何 table 的引用,那么您可能正在处理 RI 约束 and/or 触发器。