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

时间:2017-09-27 09:02:28

标签: database-performance bulkinsert sybase-ase sqlperformance

我需要插入大量数据(百万美元),我需要快速执行它。 我在.NET和JAVA上阅读了关于通过ODBC进行批量插入但我需要直接在数据库上执行它。

我也读过批量插入,但我尝试过的东西似乎没有用 Batch InsertExample

我正在执行一个INSERT SELECT,但它每行需要0.360秒,这非常慢,我需要在这里进行一些改进。

如果可能的话,我真的很感谢这里的一些指导和示例和文档。

数据库:SYBASE ASE 15.7

1 个答案:

答案 0 :(得分:1)

扩展一些评论...

  • 阻止,慢速磁盘IO和任何其他“等待”事件(即实际插入/更新活动以外的任何事件)可以从master..monProcessWaits表(where SPID = spid_of_your_insert_update_process)确定[参见P& ; T监控表手册(又名MDA表)]
  • master..monProcessObjectmaster..monProcessStatement将显示当前正在运行的查询的逻辑/物理IO [再次参见MDA表的P& T手册]
  • master..monSysStatement将显示最近已完成查询的逻辑/物理IO [再次,请参阅MDA表的P& T手册]
  • 对于UPDATE语句,您需要查看查询计划,看看您是否遇到了糟糕的加入顺序;同样重要的是...... direct(快/好)更新与deferred(慢/坏)更新; deferred更新可能由于多种原因而发生...一些可修复,一些不...更新索引列,不良连接顺序,导致页面拆分和/或行转发的更新
  • 可以使用sp_helpconstraint table_name查看RI(PK / FK)约束;查询计划还将显示在插入/更新/删除期间执行RI(PK / FK)验证时所需的底层连接
  • 触发器有点难以找到(官方sp_helptrigger直到ASE 16才出现);检查sysobjects.[ins|upd|del]trig where name = your_table - 这些表示表中任何插入/更新/删除触发器的对象ID;还检查sysobjects记录,其中type = 'TR' and deltrig = object_id(your_table) - 提供对其他插入/更新/删除触发器的支持(如果这只是ASE 16 +,请不要记得)
  • 如果触发了触发器,则需要查看关联的查询计划,以确保inserteddeleted表(如果引用)正在驱动这些伪表与永久表连接的任何查询< / LI>

我可能会忘记一些领域(在我的脑海中)......关键的一点就是“缓慢的”DML语句可能有很多原因。

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

set showplan on
go
insert/update/delete statements
go

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