2

C# で一括コピーを使用して SQL にデータをインポートしています。

アプリケーションが終了しても、SQL Server はメモリを解放しません。

100000 のバッチでデータをインポートしています。レコードの総数は約 1000 万です。

SQL サーバーのメモリを解放/クリアする方法を教えてください。

以下は私たちのコードです。

 try
        {

            using (SqlConnection SQlConn = new SqlConnection(Common.SQLConnectionString))
            {                   
                DataTable dt1 = FillEmptyDateFields(dtDestination);

                //SqlTableCreator ObjTbl = new SqlTableCreator(SQlConn);

                //ObjTbl.DestinationTableName = DestinationTable;

                using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn,SqlBulkCopyOptions.TableLock,null))
                {

                    //bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn);
                    bulkCopy.DestinationTableName = DestinationTable;
                    bulkCopy.BulkCopyTimeout = 0;
                    bulkCopy.BatchSize = dt1.Rows.Count; // Batch Size Added.
                    Logger.Log("DATATABLE FINAL :" + dt1.Rows.Count.ToString(), Logger.LogType.Info);
                    if (SQlConn.State == ConnectionState.Closed || SQlConn.State == ConnectionState.Broken)
                        SQlConn.Open();
                    bulkCopy.WriteToServer(dt1);
                    SQlConn.Close();
                    SQlConn.Dispose();
                    bulkCopy.Close();
                    if (bulkCopy != null)
                    {
                        ((IDisposable)bulkCopy).Dispose();
                    }                        
                }
                dt1.Dispose(); 
                dt1 = null;                           
            }

            dtDestination.Dispose();
            System.GC.Collect();
            dtDestination = null;                

        }
        catch (Exception ex)
        {
            Logger.Log(ex, Logger.LogType.Error);
            throw ex;

        }
        finally 
        {

        }
4

3 に答える 3

1

SQL Server は、許可されている限り多くをキャッシュするように設計されています。この制限は、SQL Server 構成で調整できます。

本当に SQL Server キャッシュをクリアしたい場合は、SQL コマンドを実行できます

DBCC DROPCLEANBUFFERS

于 2012-10-11T09:55:03.487 に答える
1

SQL Server は、必要に応じてメモリ消費量を増やします。より多くの RAM を割り当てる必要がある特定の操作が完了したときに、必ずしも解放されるとは限りません。

于 2012-10-11T09:58:52.940 に答える
-1
Create Proc  [dbo].[MP_Rpt_ConfigureMemory]
(  @Mode  bit  )
as
declare @RAM as integer
declare @MAX as integer
declare @MIN as integer

set @RAM = 
(SELECT

      [physical_memory_in_bytes]/1048576 AS [RAM (MB)]

FROM  [sys].[dm_os_sys_info] )

Set @MAX = ((@RAM / 4) * 3) 
Set @MIN = ((@RAM / 4) * 1) 

if @Mode=0
begin
      exec SP_Configure 'min server memory', 1
      RECONFIGURE
      exec SP_Configure 'max server memory', 100
      RECONFIGURE
end
else
if @Mode = 1
begin
      exec SP_Configure 'max server memory', @MAX
      RECONFIGURE
      exec SP_Configure 'min server memory', @MIN
      RECONFIGURE
end
于 2012-11-28T13:44:20.147 に答える