我在同一個數據庫服務器上有兩個名爲DB1和DB2的數據庫。我有DB2中的Table1和DB2中的Table2。目前,我正在使用插入select *來將表2中的所有數據轉移到表1中(表1爲空,我的目的是將表2中的數據複製到表1)。表結構是聚類ID列(GUID類型)和XML二進制(varbinary)數據列。SQL Server選擇並插入問題
我目前的問題是,內存消耗非常高。有沒有什麼好的想法來減少內存消耗?我的主要想法是我可以初始化幾個小事務並選擇從每個事務插入部分數據。
我正在使用VSTS 2008 + C#+ ADO.Net + SQL Server 2008 Enterprise。任何好的解決方案或參考樣本?
這是我當前的代碼,它會導致內存異常。我正在使用ADO.Net SQLBulkCopy功能。
namespace BulkCopyTable
{
public class CopyData
{
string _sourceConnectionString;
string _destinationConnectionString;
public CopyData(string sourceConnectionString,
string destinationConnectionString)
{
_sourceConnectionString =
sourceConnectionString;
_destinationConnectionString =
destinationConnectionString;
}
public void CopyTable(string table)
{
using (SqlConnection source =
new SqlConnection(_sourceConnectionString))
{
string sql = string.Format("SELECT * FROM [{0}]", table);
SqlCommand command = new SqlCommand(sql, source);
source.Open();
IDataReader dr = command.ExecuteReader();
using (SqlBulkCopy copy =
new SqlBulkCopy(_destinationConnectionString))
{
copy.DestinationTableName = table;
copy.WriteToServer(dr);
}
}
}
}
class Program
{
static void Main(string[] args)
{
CopyData copier = new CopyData(ConfigurationSettings.AppSettings["source"], ConfigurationSettings.AppSettings["destination"]);
Console.WriteLine("Begin Copy");
copier.CopyTable(ConfigurationSettings.AppSettings["Table"]);
Console.WriteLine("End Copy");
return;
}
}
}
謝謝JasonHorner,1.我想確認批量批量的大小。假設我有1M記錄,並且將批量大小設置爲500K,那麼插入第一個500K批次後,SQL Server將從頭開始繼續插入後面的500K批次,而不是重新啓動,對嗎? 2.批量加載文件非常棒!但它是針對SQL Server 2000的,任何相關文檔都適用於更新的SQL Server版本? – George2 2009-08-28 03:09:35
是的,它提交每批作爲一個單獨的交易。 試試這個 http://blogs.msdn.com/sqlcat/archive/2009/02/12/the-data-loading-performance-guide-now-available-from-msdn.aspx 我認爲對於大部分舊材料仍然有用。 – JasonHorner 2009-08-28 03:18:53
謝謝!真的很酷的文件。我會做更多的測試並在這裏給你反饋。 :-) – George2 2009-08-28 03:38:55