1

我正在尝试将多个表从一台机器上的 Sybase IQ 数据库传输到另一台机器上的同一个数据库(完全相同的模式和表布局等)。

为此,我使用了 insert from location 语句:

insert into <local table> location <other machine> select * from mytablex

这很好用,但问题是它非常慢。我在两台机器之间都有 1 Gb 的连接,但传输速率远不及此。

一个1G的测试文件,通过ftp传输只需要1到2分钟(只是一个文件,与IQ无关)。但我在 24 小时内仅管理 100 GB 的 IQ。这意味着对于通过 Sybase IQ 的数据来说,1 GB 的传输速率更像是 14 或 15 分钟。

有什么办法可以加快速度吗?

我看到有一个选项可以更改数据包大小,但这会有所不同吗?当然,如果文件的传输速度提高 7 倍,那么数据包大小就不会是一个很大的因素?

谢谢!:)

4

2 回答 2

3

此处此处的文档中可以看出,使用insert into是逐行操作,而不是批量操作。这可以解释您所看到的性能问题。

您可能想查看批量加载LOAD TABLE操作。

于 2014-04-09T18:06:27.190 回答
2

如果我没记错的话,IQ 15.x 有已知的错误,其中对于 insert...location...select 有效地忽略了 packetsize,并且始终使用默认值 512。

insert...location...select 通常是批量 tds 操作,但是我们发现它在处理千兆字节数据时价值有限,并构建了一个处理提取/加载表的进程,该进程明显更快。

我知道这不是您想要的答案,但是随着数据大小的增长,性能似乎会下降。如果它们足够大,有些表实际上永远不会完成。

只是一个想法,您可能想要指定确切的列并使用动态 sql 包装在 exec 中。动态 SQL 是不可以的,但如果您需要在 dev/qa + prod 环境中执行 proc,那么确实没有其他选择。我假设无论如何都会在受控环境中调用它,但这就是我的意思:

declare @cmd varchar(2500), @location varchar(255)

set @location = 'SOMEDEVHOST.database_name'

set @cmd =    'insert localtablename (col1, col2, coln...) ' + 
              ''''+ trim(@location)+ '''' +
              ' { select col1, col2, coln... from remotetablename}'

select @cmd

execute(@cmd)
go
于 2014-04-10T00:30:41.733 回答