在下面的Powershell代码中,用于将数据从Oracle复制到SQL Server,是否有一种方法可以将数据从Oledb适配器($ da)获取到大容量复制对象($ bcp),而无需填充数据表($ dt) )? Powershell是否可以更有效地将数据管道传输到SQL Server,例如,而不是将数据复制到数据表中,而是以更直接的方式从$ da读取到$ bcp?
$con = New-Object System.Data.OleDb.OleDbConnection($constr)
$con.open()
$cmd = New-Object system.Data.OleDb.OleDbCommand($qry,$con)
$cmd.CommandTimeout = '0'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$bcp = new-object system.data.sqlclient.Sqlbulkcopy("server=$server;database=$database;trusted_connection=true");
$bcp.DestinationTableName=$tableName;
$bcp.BulkCopyTimeout='0'
$bcp.BatchSize=75000
$bcp.WriteToServer($dt);
我正在这里寻找速度。链接服务器需要2分30秒,SSIS需要大约30秒,这大约需要20秒。因此,我想知道是否可以对此进行进一步调整。 (75K行获取大小是此oracle连接的最佳选择,因此我只是将Bulk副本设置为相同大小)。 (我没有卡在bcp上)
更新:
我从下面的评论中采纳了迈克的建议,并从等式中删除了$ dt
Function VAN-ELF () {
param (
[Parameter(Mandatory = $true)] [string]$tns,
[Parameter(Mandatory = $true)][string]$userName,
[Parameter(Mandatory = $true)][string]$password,
[Parameter(Mandatory = $true)][int]$fetchSize,
[Parameter(Mandatory = $true)][string]$sql,
[Parameter(Mandatory = $true)][string]$sqlServer,
[Parameter(Mandatory = $true)][string]$sqlTable,
[Parameter(Mandatory = $true)][string]$sqlDb
)
try
{
$con = New-Object System.Data.OleDb.OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=$tns;User Id=$userName;Password=$password;FetchSize=$fetchSize" ) ;
$con.open();
$cmd = New-Object system.Data.OleDb.OleDbCommand($sql,$con);
$cmd.CommandTimeout = '0';
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd);
$bcp = new-object system.data.sqlclient.Sqlbulkcopy("server=$sqlServer;database=$sqlDb;trusted_connection=true");
$bcp.DestinationTableName=$sqlTable;
$bcp.BulkCopyTimeout='0'
$bcp.WriteToServer($cmd.ExecuteReader());
}
catch
{
Write-Error ($_.Exception.ToString())
}
finally
{
if ($con.State -eq 'Open') { $con.close() }
}
}
这将运行时间缩短了几秒钟。