2012-02-10 4 views
3

1つのデータベースを別のデータベースに再同期させるために生成された大きな挿入ステートメント(約30メガ)のバッチを実行しようとしています。私は8ギガのメモリを搭載したWin 7マシンでSQL Server 2008 R2 64ビットを実行しています。大きなバッチのインサートを実行しているときにメモリ不足を回避するためのオプションは何ですか?

SSMSでクエリを実行すると、「クエリはエラーが発生しました」と表示され、出力メッセージは表示されません。 SSMSの外でそれを実行しようとすると、メモリ不足のエラーであることがわかりました。実際には、エラーが発生しても、SQL Serverサービスが約5.5ギガバイトのメモリを使用していることがわかりました。

SQLを実行するための調整が可能なパラメータはありますか?別の方法として、クエリをバッチに分割して実行するプログラムを作成する方法があります。興味深いことに、これは挿入を含む大きなクエリでのみ発生するようです。更新を含む大規模なクエリは正常に動作するようです。おそらく、これはトランザクションログに書き込まれるためです。ただし、クエリは一連の多数の挿入として出力されますが、これは変更できません。

とにかく、これを修正するために調整できるSQL Serverの設定はありますか?私は誰でもできるアドバイスを感謝します。

編集:お返事ありがとうございます、bluefooted。私の同僚と私は、メッセージのないエラーを最初に見たときに同じ印象を与えました.SMSのメモリが不足しているように見えました。しかし、それ以上の検査では、SQL Serverのように見えます。私に説明させてください。 Red GateのSQL比較SDKをVisual Studioで使用して差分クエリを生成し、条件付きで特定のステートメントを実行して、特定のルールに従って2つのデータベースを収束させます。したがって、この問題が発生した後、スクリプトを実行するために、含まれているExecutorオブジェクトを使用しました。

System.Data.SqlClient.SqlException occurred 
    Message=There is insufficient system memory in resource pool 'internal' to run this query. 
    Source=.Net SqlClient Data Provider 
    ErrorCode=-2146232060 
    Class=17 
    LineNumber=79180 
    Number=701 
    Procedure="" 
    Server=QA1 
    State=123 
    StackTrace: 
     at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
     at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
     at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
     at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async) 
     at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
     at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
     at RedGate.Shared.SQL.ExecutionBlock.BlockExecutor.ExecuteBlock(ExecutionBlock block, String server, String database, Boolean integratedSecurity, String userName, String password) 
     at IO.Practiceware.DbSync.Csharp.Program.RunScript(String path, String server, String database) 
    InnerException: 

私はこれで作ることができるかわからないが、私のより多くの知識のある同僚は、それは基本的に自身がメモリが不足しているSQL Serverを意味し、言った:私たちは、次のエラーを受け取りました。私はあなたがこれについて持っているすべての洞察に感謝します。

+0

メモリ不足のエラーは何ですか?通常、私はSSMSのような問題を抱えていて、SQL Serverではなくメモリが不足しています。あなたが「SSMSの外で」それを実行したと言うと、どのようにそれを実行しましたか? –

答えて

2

いくつかのアイデア:

インサートをバッチに分割してみてください。すべての1000行かそこらのようなものを挿入:

INSERT ... 
INSERT ... 
INSERT ... 

GO 

INSERT ... 
INSERT ... 
INSERT ... 

をもログへの影響を軽減するために、時々CHECKPOINTを発行することを傷つけない場合があります。

個々の挿入文を何千も送信する代わりに、それらを組み合わせてみてください。代わりに、通常のインサートのなど、bcp

INSERT dbo.table(col1,col2) SELECT 1,2 
UNION ALL SELECT 2,2 
UNION ALL SELECT 3,2; 

-- or  

INSERT dbo.table(col1,col2) 
VALUES(1,2),(2,2),(3,2); 

また、あなたがフラットテキストファイル内のデータ(というよりも挿入commmands)を格納し、BULK INSERTを使用することができます:あなたは、複数の方法で例のカップルを、これを行うことができます。

+0

返事をありがとう。コマンドをバッチに分割することになる気がします。 – user1202747