如何在 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..monProcessObject
和 master..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+,暂时不记得)
- 如果触发器被触发,需要检查相关的查询计划以确保
inserted
和 deleted
tables(如果引用)正在驱动这些伪的任何查询tables 与永久 tables 合并
可能有一些地方我忘记了(不在我的脑海中)……关键是 'slow' DML 语句可能有很多原因。
一种(相对)快速的方法来查明 RI (PK/FK) 约束或触发器是否在起作用...
set showplan on
go
insert/update/delete statements
go
然后查看生成的查询计划;如果您看到对 insert/update/delete 语句中明确列出的引用以外的任何 table 的引用,那么您可能正在处理 RI 约束 and/or 触发器。
我需要插入大量数据(数百万)并且需要快速执行。 我在 .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..monProcessObject
和master..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+,暂时不记得) - 如果触发器被触发,需要检查相关的查询计划以确保
inserted
和deleted
tables(如果引用)正在驱动这些伪的任何查询tables 与永久 tables 合并
可能有一些地方我忘记了(不在我的脑海中)……关键是 'slow' DML 语句可能有很多原因。
一种(相对)快速的方法来查明 RI (PK/FK) 约束或触发器是否在起作用...
set showplan on
go
insert/update/delete statements
go
然后查看生成的查询计划;如果您看到对 insert/update/delete 语句中明确列出的引用以外的任何 table 的引用,那么您可能正在处理 RI 约束 and/or 触发器。