校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > SQL批量插入數據幾種方案的性能詳細對比

SQL批量插入數據幾種方案的性能詳細對比

熱門標簽:鎮江網路外呼系統供應商 百度地圖標注改顏色 外呼運營商線路收費 臨沂智能電銷機器人加盟哪家好 電銷外呼有錄音系統有哪些 一個導航軟件能用幾個地圖標注點 小e電話機器人 貴州房產智能外呼系統供應商 申請400電話在哪辦理流程
公司技術背景:數據庫訪問類(xxx.DataBase.Dll)調用存儲過程實現數據庫的訪問。

技術方案一:

壓縮時間下程序員寫出的第一個版本,僅僅為了完成任務,沒有從程序上做任何優化,實現方式是利用數據庫訪問類調用存儲過程,利用循環逐條插入。很明顯,這種方式效率并不高,于是有了前面的兩位同事討論效率低的問題。

技術方案二:

由于是考慮到大數據量的批量插入,于是我想到了ADO.NET2.0的一個新的特性:SqlBulkCopy。有關這個的性能,很早之前我是親自做過性能測試的,效率非常高。這也是我向公司同事推薦的技術方案。

技術方案三:

利用SQLServer2008的新特性--表值參數(Table-Valued Parameter)。表值參數是SQLServer2008才有的一個新特性,使用這個新特性,我們可以把一個表類型作為參數傳遞到函數或存儲過程里。不過,它也有一個特點:表值參數在插入數目少于 1000 的行時具有很好的執行性能。

技術方案四:

對于單列字段,可以把要插入的數據進行字符串拼接,最后再在存儲過程中拆分成數組,然后逐條插入。查了一下存儲過程中參數的字符串的最大長度,然后除以字段的長度,算出一個值,很明顯是可以滿足要求的,只是這種方式跟第一種方式比起來,似乎沒什么提高,因為原理都是一樣的。

技術方案五:

考慮異步創建、消息隊列等等。這種方案無論從設計上還是開發上,難度都是有的。

技術方案一肯定是要被否掉的了,剩下的就是在技術方案二跟技術方案三之間做一個抉擇,鑒于公司目前的情況,技術方案四跟技術方案五就先不考慮了。

接下來,為了讓大家對表值參數的創建跟調用有更感性的認識,我將寫的更詳細些,文章可能也會稍長些,不關注細節的朋友們可以選擇跳躍式的閱讀方式。

再說一下測試方案吧,測試總共分三組,一組是插入數量小于1000的,另外兩組是插入數據量大于1000的(這里我們分別取10000跟1000000),每組測試又分10次,取平均值。怎么做都明白了,Let's go!

1.創建表。

為了簡單,表中只有一個字段,如下圖所示:

2.創建表值參數類型

我們打開查詢分析器,然后在查詢分析器中執行下列代碼:

Create Type PassportTableType as Table
(
PassportKey nvarchar(50)
)

執行成功以后,我們打開企業管理器,按順序依次展開下列節點--數據庫、展開可編程性、類型、用戶自定義表類型,就可以看到我們創建好的表值類型了如下圖所示:

說明我們創建表值類型成功了。

3.編寫存儲過程

存儲過程的代碼為:

復制代碼 代碼如下:

USE [TestInsert]
GO
/****** Object: StoredProcedure [dbo].[CreatePassportWithTVP] Script Date: 03/02/2010 00:14:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    Kevin>
-- Create date: 2010-3-1>
-- Description:    創建通行證>
-- =============================================
Create PROCEDURE [dbo].[CreatePassportWithTVP]
@TVP PassportTableType readonly
AS
BEGIN
SET NOCOUNT ON;
Insert into Passport(PassportKey) select PassportKey from @TVP
END

可能在查詢分析器中,智能提示會提示表值類型有問題,會出現紅色下劃線(見下圖),不用理會,繼續運行我們的代碼,完成存儲過程的創建
 
4.編寫代碼調用存儲過程。

三種數據庫的插入方式代碼如下,由于時間比較緊,代碼可能不那么易讀,特別代碼我加了些注釋。
復制代碼 代碼如下:

using System;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using com.DataAccess;
namespace ConsoleAppInsertTest
{
class Program
{
static string connectionString = SqlHelper.ConnectionStringLocalTransaction; //數據庫連接字符串
static int count = 1000000; //插入的條數
static void Main(string[] args)
{
//long commonInsertRunTime = CommonInsert();
//Console.WriteLine(string.Format("普通方式插入{1}條數據所用的時間是{0}毫秒", commonInsertRunTime, count));
long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert();
Console.WriteLine(string.Format("使用SqlBulkCopy插入{1}條數據所用的時間是{0}毫秒", sqlBulkCopyInsertRunTime, count));
long TVPInsertRunTime = TVPInsert();
Console.WriteLine(string.Format("使用表值方式(TVP)插入{1}條數據所用的時間是{0}毫秒", TVPInsertRunTime, count));
}
/// summary>
/// 普通調用存儲過程插入數據
/// /summary>
/// returns>/returns>
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;
}
/// summary>
/// 使用SqlBulkCopy方式插入數據
/// /summary>
/// param name="dataTable">/param>
/// returns>/returns>
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://wlb.cnblogs.com/

您可能感興趣的文章:
  • SQLServer 批量插入數據的兩種方法
  • 用SQL批量插入數據的代碼
  • 用SQL批量插入數據的存儲過程
  • sql server中批量插入與更新兩種解決方案分享(存儲過程)
  • sql server中批量插入與更新兩種解決方案分享(asp.net)
  • mssql2008 自定義表類型實現(批量插入或者修改)
  • 關于sql server批量插入和更新的兩種解決方案
  • sql下三種批量插入數據的方法
  • 用一條mysql語句插入多條數據
  • SQL Server中數據行批量插入腳本的存儲實現
  • C#實現SQL批量插入數據到表的方法
  • CI框架AR操作(數組形式)實現插入多條sql數據的方法
  • SQL Server使用一個語句塊批量插入多條記錄的三種方法

標簽:澳門 三明 合肥 日照 保定 延邊 嘉興 晉城

巨人網絡通訊聲明:本文標題《SQL批量插入數據幾種方案的性能詳細對比》,本文關鍵詞  SQL,批量,插入,數據,幾種,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL批量插入數據幾種方案的性能詳細對比》相關的同類信息!
  • 本頁收集關于SQL批量插入數據幾種方案的性能詳細對比的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产色婷婷亚洲99精品小说| 中文字幕一区免费在线观看| 亚洲成人资源网| 91麻豆自制传媒国产之光| 中文字幕一区二| 一本到三区不卡视频| 夜夜精品浪潮av一区二区三区| 91亚洲男人天堂| 午夜视频在线观看一区| 欧美一区二区三区四区五区| 亚洲人妖av一区二区| 日韩欧美在线网站| 久久99精品国产麻豆不卡| 国产欧美一区二区精品性| 99久久国产免费看| 日本不卡免费在线视频| 久久一日本道色综合| 欧美日韩高清一区| 懂色中文一区二区在线播放| 午夜精品一区二区三区电影天堂| 69精品人人人人| 国产成人aaaa| 免费人成黄页网站在线一区二区| 欧美极品xxx| 日韩欧美一区二区视频| 欧美日韩成人综合天天影院 | 国产91精品入口| 视频一区视频二区中文字幕| 国产精品三级在线观看| 国产日韩欧美综合在线| 日韩欧美一区中文| 在线不卡欧美精品一区二区三区| 麻豆一区二区三| 一区二区三区美女视频| 国产精品国产精品国产专区不片| 久久一留热品黄| 国产午夜精品在线观看| 国产欧美1区2区3区| 2021国产精品久久精品| 国产色一区二区| 国产精品毛片久久久久久| 国产精品久久久久四虎| 亚洲视频一区二区在线| 亚洲精品第1页| 午夜伊人狠狠久久| 香蕉成人啪国产精品视频综合网| 亚洲色图欧美偷拍| 日韩av成人高清| 国产成人a级片| 91色|porny| 欧美成人伊人久久综合网| 国产偷国产偷精品高清尤物| 综合久久综合久久| 美腿丝袜亚洲三区| 亚欧色一区w666天堂| 香蕉成人伊视频在线观看| 国产乱码精品一品二品| 一本久久精品一区二区| 日韩三级精品电影久久久| 国产日韩在线不卡| 韩国精品主播一区二区在线观看 | 99久久精品免费看| 欧美日韩免费在线视频| 国产欧美一区二区精品忘忧草| 午夜天堂影视香蕉久久| www.在线欧美| 中文字幕乱码一区二区免费| 亚洲午夜av在线| 在线视频一区二区三区| 国产精品国产三级国产aⅴ原创| 免费久久精品视频| 日韩一区二区三区视频| 亚洲制服丝袜av| 99精品视频中文字幕| 国产精品水嫩水嫩| 成人精品免费视频| 国产欧美日韩三级| 国产精品1区二区.| 精品国产污网站| 国产91精品欧美| 国产精品国产成人国产三级| 国产综合久久久久影院| 久久久久99精品一区| 国产露脸91国语对白| 国产欧美中文在线| 色综合咪咪久久| 午夜影院在线观看欧美| 日韩视频一区二区在线观看| 麻豆国产精品视频| 国产偷v国产偷v亚洲高清| 99久久99久久精品免费观看| 亚洲欧美自拍偷拍| 欧美伦理影视网| 视频一区二区三区入口| 国产亚洲制服色| 97久久精品人人爽人人爽蜜臀| 国产精品高潮久久久久无| 99久久久无码国产精品| 日本视频一区二区三区| 国产精品免费av| 精品无人码麻豆乱码1区2区 | 男男gaygay亚洲| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲综合在线第一页| 3d动漫精品啪啪| 色综合久久九月婷婷色综合| 久久99热狠狠色一区二区| 洋洋成人永久网站入口| 国产精品入口麻豆九色| 精品国产乱码久久久久久久| 在线免费亚洲电影| 顶级嫩模精品视频在线看| 日韩国产精品大片| 日日夜夜精品免费视频| 一区二区三区影院| 久久这里只有精品6| 欧美日韩一区二区在线观看 | 国产成人午夜电影网| 日本成人在线视频网站| 爽爽淫人综合网网站| 天天免费综合色| 日本成人在线视频网站| 日韩 欧美一区二区三区| 免费欧美在线视频| 日本成人超碰在线观看| 亚洲国产aⅴ成人精品无吗| 亚洲一区二区在线视频| 亚洲成人免费影院| 日一区二区三区| 精品写真视频在线观看| 91在线看国产| 欧美一a一片一级一片| 欧美一区二区日韩| 91精品国产美女浴室洗澡无遮挡| 欧美一区二区三区人| 欧美激情在线观看视频免费| 亚洲乱码中文字幕| 精品无人码麻豆乱码1区2区 | 91国偷自产一区二区三区观看 | 国产精品资源在线看| 舔着乳尖日韩一区| 日韩电影在线观看电影| 粉嫩欧美一区二区三区高清影视| 色老汉一区二区三区| 久久久久久免费毛片精品| 亚洲一区二区三区在线| 成人精品国产福利| 欧美一级夜夜爽| 亚洲一区二区三区四区五区中文 | 欧美色倩网站大全免费| 国产欧美精品一区二区色综合| 亚洲电影中文字幕在线观看| 国产成人av网站| 欧美一区国产二区| 亚洲制服丝袜在线| 99re成人精品视频| 亚洲人一二三区| 97久久精品人人做人人爽| 国产日韩欧美精品综合| 国产精品一区专区| 久久天天做天天爱综合色| 日本系列欧美系列| 欧美一区日本一区韩国一区| 三级影片在线观看欧美日韩一区二区| 成人国产亚洲欧美成人综合网| 国产亚洲女人久久久久毛片| 国精品**一区二区三区在线蜜桃| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 4hu四虎永久在线影院成人| 蜜桃视频在线一区| 精品91自产拍在线观看一区| 韩国精品免费视频| 国产精品视频一二三区 | 制服视频三区第一页精品| 日韩电影在线免费看| 国产三级精品在线| 9l国产精品久久久久麻豆| 亚洲丰满少妇videoshd| 久久综合资源网| 99久久精品免费精品国产| 天堂蜜桃一区二区三区| 久久午夜羞羞影院免费观看| 成人在线综合网| 丝袜美腿一区二区三区| 国产女同互慰高潮91漫画| 欧美日韩和欧美的一区二区| 国产曰批免费观看久久久| 一区二区三区在线免费播放| 日韩三级免费观看| 在线亚洲精品福利网址导航| 蜜臀av一级做a爰片久久| 国产精品久久久久久亚洲伦 | 国内不卡的二区三区中文字幕| 国产精品看片你懂得| 国产成人在线网站| 亚洲国产成人精品视频| 中文字幕色av一区二区三区| 2020国产精品| 精品日韩欧美在线| 5858s免费视频成人|