使用"从位置"插入转移表格Sybase IQ中的语句非常慢

时间:2014-04-09 17:39:16

标签: sql sybase data-transfer sybase-iq

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

要做到这一点,我正在使用位置声明中的插入:

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

这很好用,但问题是它非常慢。我在两台机器之间连接了1千兆位,但传输速率远远不及。

使用1千兆字节的测试文件,通过ftp传输它只需要1或2分钟(就像文件一样,与智商无关)。 但我在智商24小时内只能管理100千兆字节。这意味着对于通过Sybase IQ的数据,1千兆字节的传输速率更像是14或15分钟。

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

我看到有一个选项可以改变数据包大小,但这会有所不同吗?当然,如果传输速度比文件快7倍,那么数据包大小就不会那么大吗?

谢谢! :)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果我没记错的话,IQ 15.x已经知道错误,其中packetize被有效地忽略了insert ... location ... select并且总是使用默认的512.

insert ... location ... select通常是批量tds操作,但是我们发现它在处理数GB的数据时具有有限的价值,并构建了一个处理提取/加载表的过程,速度明显加快。

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

只是想一想,您可能希望指定确切的列并使用动态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