• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • SQLServer中批量插入數據方式的性能對比(2)

    發表于:2012-07-20來源:博客園作者:Kevin點擊數: 標簽:SQLServer
    long TVPInsertRunTime = TVPInsert(); Console.WriteLine(string.Format(使用表值方式(TVP)插入{1}條數據所用的時間是{0}毫秒, TVPInsertRunTime, count)); } /// /// 普通調用存儲過程插

      long TVPInsertRunTime = TVPInsert();

      Console.WriteLine(string.Format("使用表值方式(TVP)插入{1}條數據所用的時間是{0}毫秒", TVPInsertRunTime, count));

      }

      ///

      /// 普通調用存儲過程插入數據

      ///

      ///

      private static long CommonInsert()

      {

      Stopwatch stopwatch = new Stopwatch();

      stopwatch.Start();

      string passportKey;

      for (int i = 0; i < count; i++)

      {

      passportKey = Guid.NewGuid().ToString();

      SqlParameter[] sqlParameter = { new SqlParameter("@passport", passportKey) };

      SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassport", sqlParameter);

      }

      stopwatch.Stop();

      return stopwatch.ElapsedMilliseconds;

      }

      ///

      /// 使用SqlBulkCopy方式插入數據

      ///

      ///

      ///

      private static long SqlBulkCopyInsert()

      {

      Stopwatch stopwatch = new Stopwatch();

      stopwatch.Start();

      DataTable dataTable = GetTableSchema();

      string passportKey;

      for (int i = 0; i < count; i++)

      {

      passportKey = Guid.NewGuid().ToString();

      DataRow dataRow = dataTable.NewRow();

      dataRow[0] = passportKey;

      dataTable.Rows.Add(dataRow);

      }

      SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);

      sqlBulkCopy.DestinationTableName = "Passport";

      sqlBulkCopy.BatchSize = dataTable.Rows.Count;

      SqlConnection sqlConnection = new SqlConnection(connectionString);

      sqlConnection.Open();

      if (dataTable!=null && dataTable.Rows.Count!=0)

      {

      sqlBulkCopy.WriteToServer(dataTable);

      }

      sqlBulkCopy.Close();

      sqlConnection.Close();

      stopwatch.Stop();

      return stopwatch.ElapsedMilliseconds;

      }

      private static long TVPInsert()

      {

      Stopwatch stopwatch = new Stopwatch();

      stopwatch.Start();

      DataTable dataTable = GetTableSchema();

      string passportKey;

      for (int i = 0; i < count; i++)

      {

      passportKey = Guid.NewGuid().ToString();

      DataRow dataRow = dataTable.NewRow();

      dataRow[0] = passportKey;

      dataTable.Rows.Add(dataRow);

      }

      SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };

      SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);

      stopwatch.Stop();

      return stopwatch.ElapsedMilliseconds;

      }

      private static DataTable GetTableSchema()

      {

      DataTable dataTable = new DataTable();

      dataTable.Columns.AddRange(new DataColumn[] { new DataColumn("PassportKey") });

      return dataTable;

      }

      }

      }

      比較神秘的代碼其實就下面這兩行,該代碼是將一個dataTable做為參數傳給了我們的存儲過程。簡單吧。

      SqlParameter[] sqlParameter = { new SqlParameter("@TVP", dataTable) };

      SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "CreatePassportWithTVP", sqlParameter);

      5.測試并記錄測試結果

    第一組測試,插入記錄數1000
    第二組測試,插入記錄數10000
    第三組測試,插入記錄數1000000

      通過以上測試方案,不難發現,技術方案二的優勢還是蠻高的。無論是從通用性還是從性能上考慮,都應該是

      優先被選擇的,還有一點,它的技術復雜度要比技術方案三要簡單一些,

      設想我們把所有表都創建一遍表值類型,工作量還是有的。因此,我依然堅持我開始時的決定,

      向公司推薦使用第二種技術方案。

      寫到此,本文就算完了,但是對新技術的鉆研仍然還在不斷繼續。要做的東西還是挺多的。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>