婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)

MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)

熱門(mén)標(biāo)簽:400電話(huà)辦理泰安 安卡拉地圖標(biāo)注app 我要地圖標(biāo)注數(shù)量有限制嗎 家庭農(nóng)場(chǎng)地圖標(biāo)注名稱(chēng)怎樣起名 電話(huà)機(jī)器人怎么代理商 互聯(lián)網(wǎng)電話(huà)外呼系統(tǒng) 電銷(xiāo)需要外呼系統(tǒng)嗎 零成本地圖標(biāo)注賺錢(qián) 千呼電話(huà)機(jī)器人可以試用嗎

需求

 現(xiàn)在有一個(gè)需求是將10w條數(shù)據(jù)插入到MSSQL數(shù)據(jù)庫(kù)中,表結(jié)構(gòu)如下,你會(huì)怎么做,你感覺(jué)插入10W條數(shù)據(jù)插入到MSSQL如下的表中需要多久呢?

或者你的批量數(shù)據(jù)是如何插入的呢?我今天就此問(wèn)題做個(gè)探討。

壓測(cè)mvc的http接口看下數(shù)據(jù)

首先說(shuō)下這里只是做個(gè)參照,來(lái)理解插入數(shù)據(jù)庫(kù)的性能狀況,與開(kāi)篇的需求無(wú)半毛錢(qián)關(guān)系。

mvc接口代碼如下:

public bool Add(CustomerFeedbackEntity m)
    {
      using (var conn=Connection)
      {
        string sql = @"INSERT INTO [dbo].[CustomerFeedback]
                      ([BusType]
                      ,[CustomerPhone]
                      ,[BackType]
                      ,[Content]
                     )
                   VALUES
                      (@BusType
                      ,@CustomerPhone
                      ,@BackType
                      ,@Content
                      )";
        return conn.Execute(sql, m) > 0;
      }
    }

壓測(cè)的此mvc接口單條數(shù)據(jù)插入數(shù)據(jù)庫(kù)的聚合數(shù)據(jù)圖。

用例這樣的:5000個(gè)請(qǐng)求分500個(gè)線(xiàn)程執(zhí)行post請(qǐng)求接口。

這個(gè)圖告訴我們,最慢的請(qǐng)求只用啦4毫秒。那么我們做個(gè)算法。

如開(kāi)篇的需求來(lái)看,我們用最小的響應(yīng)時(shí)間來(lái)計(jì)算。

那么插入10w條數(shù)據(jù)到數(shù)據(jù)庫(kù)需用時(shí)=100000*4毫秒,大致是6.67分鐘。那么我們奔著這個(gè)目標(biāo)來(lái)做出插入方案。

最常見(jiàn)的insert做法

首先我們的工程師拿到需求后這樣寫(xiě)啦段代碼,如下:

//執(zhí)行數(shù)據(jù)條數(shù)
    int cnt = 10 * 10000;
    //要插入的數(shù)據(jù)
    CustomerFeedbackEntity m = new CustomerFeedbackEntity() { BusType = 1, CustomerPhone = "1888888888", BackType = 1, Content = "123123dagvhkfhsdjk肯定會(huì)撒嬌繁華的撒嬌防護(hù)等級(jí)劃分噶哈蘇德高房?jī)r(jià)盛大開(kāi)放" };
    //第一種
    public void FristWay()
    {
      using (var conn = new SqlConnection(ConnStr))
      {
        conn.Open();
        Stopwatch sw = new Stopwatch();
        sw.Start();
        StringBuilder sb = new StringBuilder();
        Console.WriteLine("從:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "開(kāi)始循環(huán)執(zhí)行:" + cnt + "條sql語(yǔ)句 ...");
        for (int i = 0; i = cnt; i++)
        {
          sb.Clear();
          sb.Append(@"INSERT INTO [dbo].[CustomerFeedback]
                      ([BusType]
                      ,[CustomerPhone]
                      ,[BackType]
                      ,[Content]
                     )
                   VALUES(");
          sb.Append(m.BusType);
          sb.Append(",'");
          sb.Append(m.CustomerPhone);
          sb.Append("',");
          sb.Append(m.BackType);
          sb.Append(",'");
          sb.Append(m.Content);
          sb.Append("')");
          using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
          {
            cmd.CommandTimeout = 0;
            cmd.ExecuteNonQuery();
          }
        }
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),執(zhí)行:" + cnt + "條sql語(yǔ)句完成 ! 耗時(shí):" + sw.ElapsedMilliseconds + "毫秒。");
      }
    }

執(zhí)行結(jié)果如下:

10w條數(shù)據(jù),693906毫秒,11分鐘,有沒(méi)有感覺(jué)還行,或者還可以接受的。親們,我是吐血狀不說(shuō)話(huà),繼續(xù)寫(xiě),你們看MSSQL數(shù)據(jù)庫(kù)與.Net配合插入止于哪里?

點(diǎn)評(píng)下:

1、不停的創(chuàng)建與釋放sqlcommon對(duì)象,會(huì)有性能浪費(fèi)。

2、不停的與數(shù)據(jù)庫(kù)建立連接,會(huì)有很大的性能損耗。

此2點(diǎn)還有執(zhí)行結(jié)果告訴我們,此種方式不可取,即便這是我們最常見(jiàn)的數(shù)據(jù)插入方式。

那么我們針對(duì)以上兩點(diǎn)做優(yōu)化,1、創(chuàng)建一次sqlcommon對(duì)象,只與數(shù)據(jù)庫(kù)建立一次連接。優(yōu)化改造代碼如下:

public void SecondWay()
    {
      using (var conn = new SqlConnection(ConnStr))
      {
        conn.Open();
        Stopwatch sw = new Stopwatch();
        sw.Start();
        StringBuilder sb = new StringBuilder();
        Console.WriteLine("從:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "開(kāi)始循環(huán)拼接:" + cnt + "條sql語(yǔ)句 ...");
        for (int i = 0; i = cnt; i++)
        {
          sb.Append(@"INSERT INTO [dbo].[CustomerFeedback]
                      ([BusType]
                      ,[CustomerPhone]
                      ,[BackType]
                      ,[Content]
                     )
                   VALUES(");
          sb.Append(m.BusType);
          sb.Append(",'");
          sb.Append(m.CustomerPhone);
          sb.Append("',");
          sb.Append(m.BackType);
          sb.Append(",'");
          sb.Append(m.Content);
          sb.Append("')");
        }
        var result = sw.ElapsedMilliseconds;
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),循環(huán)拼接:" + cnt + "條sql語(yǔ)句完成 ! 耗時(shí):" + result + "毫秒。");
        using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
        {
          cmd.CommandTimeout = 0;
          Stopwatch sw1 = new Stopwatch();
          sw1.Start();
          Console.WriteLine("從:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "開(kāi)始執(zhí)行:" + cnt + "條sql語(yǔ)句 ...");
          cmd.ExecuteNonQuery();
          Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),執(zhí)行:" + cnt + "條sql語(yǔ)句完成 ! 耗時(shí):" + sw1.ElapsedMilliseconds + "毫秒。");
        }
      }
    }

執(zhí)行結(jié)果如下:

呀,好奇怪啊,為什么跟上一個(gè)方案沒(méi)有多大區(qū)別呢?

首先我們看下拼接這么長(zhǎng)的sql語(yǔ)句是怎么在數(shù)據(jù)庫(kù)中是怎么執(zhí)行的。

1、查看數(shù)據(jù)庫(kù)的連接情況

select * from sysprocesses where dbid in (select dbid from sysdatabases where name='dbname')
--或者
SELECT * FROM
[Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT 
  [DBID]
FROM 
  [Master].[dbo].[SYSDATABASES]
WHERE 
  NAME='dbname'
)

2、查看數(shù)據(jù)庫(kù)正在執(zhí)行的sql語(yǔ)句

SELECT [Spid] = session_id ,
      ecid ,
      [Database] = DB_NAME(sp.dbid) ,
      [User] = nt_username ,
      [Status] = er.status ,
      [Wait] = wait_type ,
      [Individual Query] = SUBSTRING(qt.text,
                      er.statement_start_offset / 2,
                      ( CASE WHEN er.statement_end_offset = -1
                         THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))
                            * 2
                         ELSE er.statement_end_offset
                       END - er.statement_start_offset )
                      / 2) ,
      [Parent Query] = qt.text ,
      Program = program_name ,
      hostname ,
      nt_domain ,
      start_time
  FROM  sys.dm_exec_requests er
      INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
      CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
  WHERE  session_id > 50 -- Ignore system spids.
      AND session_id NOT IN ( @@SPID ) -- Ignore this current statement.
ORDER BY  1 ,

點(diǎn)評(píng):雖然看似得到啦優(yōu)化,其實(shí)與上一個(gè)解決方案的執(zhí)行過(guò)程幾乎是一樣的,所以就不用多說(shuō)什么啦。

利于MSSQL數(shù)據(jù)庫(kù)的用戶(hù)自定義表類(lèi)型做優(yōu)化
依舊先上代碼,或許這樣你才能對(duì)用戶(hù)自定義表類(lèi)型產(chǎn)生興趣。

CREATE TYPE CustomerFeedbackTemp AS TABLE(
BusType int NOT NULL,
CustomerPhone varchar(40) NOT NULL,
BackType int NOT NULL,
Content nvarchar(1000) NOT NULL
)
public void ThirdWay()
    {
      Stopwatch sw = new Stopwatch();
      Stopwatch sw1 = new Stopwatch();
      DataTable dt = GetTable();
      using (var conn = new SqlConnection(ConnStr))
      {
        string sql = @"INSERT INTO[dbo].[CustomerFeedback]
                      ([BusType]
                      ,[CustomerPhone]
                      ,[BackType]
                      ,[Content]
                     ) select BusType,CustomerPhone,BackType,[Content] from @TempTb";
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
          cmd.CommandTimeout = 0;
          SqlParameter catParam = cmd.Parameters.AddWithValue("@TempTb", dt);
          catParam.SqlDbType = SqlDbType.Structured;
          catParam.TypeName = "dbo.CustomerFeedbackTemp";
          conn.Open();
          Console.WriteLine("從:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "開(kāi)始循環(huán)插入內(nèi)存表中:" + cnt + "條數(shù)據(jù) ...");
          sw.Start();
          for (int i = 0; i  cnt; i++)
          {
            DataRow dr = dt.NewRow();
            dr[0] = m.BusType;
            dr[1] = m.CustomerPhone;
            dr[2] = m.BackType;
            dr[3] = m.Content;
            dt.Rows.Add(dr);
          }
          Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),循環(huán)插入內(nèi)存表:" + cnt + "條數(shù)據(jù)完成 ! 耗時(shí):" + sw.ElapsedMilliseconds + "毫秒。");
          sw1.Start();
          if (dt != null  dt.Rows.Count != 0)
          {
            cmd.ExecuteNonQuery();
            sw.Stop();
          }
          Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),執(zhí)行:" + cnt + "條數(shù)據(jù)的datatable的數(shù)據(jù)進(jìn)數(shù)據(jù)庫(kù) ! 耗時(shí):" + sw1.ElapsedMilliseconds + "毫秒。");
        }
      }
    }

運(yùn)行結(jié)果:

哇抓Q,不到2秒,不到2秒,怎么比每條4毫秒還快,不敢相信,是不是運(yùn)行出問(wèn)題啦。

再來(lái)一遍

再來(lái)一遍

是的你沒(méi)有看錯(cuò),10w條數(shù)據(jù),不到2秒。是不是迫不及待的要知道為什么?迫不及待的想知道我們用到的用戶(hù)自定義表類(lèi)型是什么?

用戶(hù)自定義表類(lèi)型

首先類(lèi)型大家應(yīng)該很容易理解,像int,varchar,bit等都是類(lèi)型,那么這個(gè)表類(lèi)型是個(gè)毛線(xiàn)呢?

其實(shí)他就是用戶(hù)可以自己定義一個(gè)表結(jié)構(gòu)然后把他當(dāng)作一個(gè)類(lèi)型。

創(chuàng)建自定義類(lèi)型的詳細(xì)文檔:https://msdn.microsoft.com/zh-cn/library/ms175007.aspx

其次自定義類(lèi)型也有一些限制,安全性:https://msdn.microsoft.com/zh-cn/library/bb522526.aspx

然后就是如何用這個(gè)類(lèi)型,他的使用就是作為表值參數(shù)來(lái)使用的。

使用表值參數(shù),可以不必創(chuàng)建臨時(shí)表或許多參數(shù),即可向 Transact-SQL 語(yǔ)句或例程(如存儲(chǔ)過(guò)程或函數(shù))發(fā)送多行數(shù)據(jù)。

表值參數(shù)與 OLE DB 和 ODBC 中的參數(shù)數(shù)組類(lèi)似,但具有更高的靈活性,且與 Transact-SQL 的集成更緊密。 表值參數(shù)的另一個(gè)優(yōu)勢(shì)是能夠參與基于數(shù)據(jù)集的操作。

Transact-SQL 通過(guò)引用向例程傳遞表值參數(shù),以避免創(chuàng)建輸入數(shù)據(jù)的副本。 可以使用表值參數(shù)創(chuàng)建和執(zhí)行 Transact-SQL 例程,并且可以使用任何托管語(yǔ)言從 Transact-SQL 代碼、托管客戶(hù)端以及本機(jī)客戶(hù)端調(diào)用它們。

優(yōu)點(diǎn)

就像其他參數(shù)一樣,表值參數(shù)的作用域也是存儲(chǔ)過(guò)程、函數(shù)或動(dòng)態(tài) Transact-SQL 文本。 同樣,表類(lèi)型變量也與使用 DECLARE 語(yǔ)句創(chuàng)建的其他任何局部變量一樣具有作用域。 可以在動(dòng)態(tài) Transact-SQL 語(yǔ)句內(nèi)聲明表值變量,并且可以將這些變量作為表值參數(shù)傳遞到存儲(chǔ)過(guò)程和函數(shù)。

表值參數(shù)具有更高的靈活性,在某些情況下,可比臨時(shí)表或其他傳遞參數(shù)列表的方法提供更好的性能。 表值參數(shù)具有以下優(yōu)勢(shì):

首次從客戶(hù)端填充數(shù)據(jù)時(shí),不獲取鎖。

提供簡(jiǎn)單的編程模型。

允許在單個(gè)例程中包括復(fù)雜的業(yè)務(wù)邏輯。

減少到服務(wù)器的往返。

可以具有不同基數(shù)的表結(jié)構(gòu)。

是強(qiáng)類(lèi)型。

使客戶(hù)端可以指定排序順序和唯一鍵。

在用于存儲(chǔ)過(guò)程時(shí)像臨時(shí)表一樣被緩存。 從 SQL Server 2012 開(kāi)始,對(duì)于參數(shù)化查詢(xún),表值參數(shù)也被緩存。

限制

表值參數(shù)有下面的限制:

SQL Server 不維護(hù)表值參數(shù)列的統(tǒng)計(jì)信息。

表值參數(shù)必須作為輸入 READONLY 參數(shù)傳遞到 Transact-SQL 例程。 不能在例程體中對(duì)表值參數(shù)執(zhí)行諸如 UPDATE、DELETE 或 INSERT 這樣的 DML 操作。

不能將表值參數(shù)用作 SELECT INTO 或 INSERT EXEC 語(yǔ)句的目標(biāo)。 表值參數(shù)可以在 SELECT INTO 的 FROM 子句中,也可以在 INSERT EXEC 字符串或存儲(chǔ)過(guò)程中。

常見(jiàn)的BULK INSERT 數(shù)據(jù)集插入優(yōu)化

public void FourWay()
    {

      Stopwatch sw = new Stopwatch();
      Stopwatch sw1 = new Stopwatch();
      DataTable dt = GetTable();
      using (SqlConnection conn = new SqlConnection(ConnStr))
      {
        SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
        bulkCopy.BulkCopyTimeout = 0;
        bulkCopy.DestinationTableName = "CustomerFeedback";
        bulkCopy.BatchSize = dt.Rows.Count;
        conn.Open();
        Console.WriteLine("從:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "開(kāi)始循環(huán)插入內(nèi)存表中:" + cnt + "條數(shù)據(jù) ...");
        sw.Start();
        for (int i = 0; i  cnt; i++)
        {
          DataRow dr = dt.NewRow();
          dr[0] = m.BusType;
          dr[1] = m.CustomerPhone;
          dr[2] = m.BackType;
          dr[3] = m.Content;
          dt.Rows.Add(dr);
        }
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),循環(huán)插入內(nèi)存表:" + cnt + "條數(shù)據(jù)完成 ! 耗時(shí):" + sw.ElapsedMilliseconds + "毫秒。");
        sw1.Start();
        if (dt != null  dt.Rows.Count != 0)
        {
          bulkCopy.WriteToServer(dt);
          sw.Stop();
        }
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時(shí),執(zhí)行:" + cnt + "條數(shù)據(jù)的datatable的數(shù)據(jù)進(jìn)數(shù)據(jù)庫(kù) ! 耗時(shí):" + sw1.ElapsedMilliseconds + "毫秒。");
      }

執(zhí)行結(jié)果:

1秒之內(nèi)完成,1秒之內(nèi)完成,看完這個(gè)簡(jiǎn)直要在1秒之內(nèi)完成10w條數(shù)據(jù)的插入的節(jié)奏,逆天,逆天啊。

bulk insert詳解:https://msdn.microsoft.com/zh-cn/library/ms188365.aspx

專(zhuān)業(yè)的點(diǎn)評(píng):

表值參數(shù)的使用方法與其他基于數(shù)據(jù)集的變量的使用方法相似;但是,頻繁使用表值參數(shù)將比大型數(shù)據(jù)集要快。 大容量操作的啟動(dòng)開(kāi)銷(xiāo)比表值參數(shù)大,與之相比,表值參數(shù)在插入數(shù)目少于 1000 的行時(shí)具有很好的執(zhí)行性能。

重用的表值參數(shù)可從臨時(shí)表緩存中受益。 這一表緩存功能可比對(duì)等的 BULK INSERT 操作提供更好的伸縮性。 使用小型行插入操作時(shí),可以通過(guò)使用參數(shù)列表或批量語(yǔ)句(而不是 BULK INSERT 操作或表值參數(shù))來(lái)獲得小的性能改進(jìn)。 但是,這些方法在編程上不太方便,并且隨著行的增加,性能會(huì)迅速下降。

表值參數(shù)在執(zhí)行性能上與對(duì)等的參數(shù)陣列實(shí)現(xiàn)相當(dāng)甚至更好。

總結(jié)

接下來(lái)是大家最喜歡的總結(jié)內(nèi)容啦,內(nèi)容有三,如下:

1、希望能關(guān)注我其他的文章。

2、博客里面有沒(méi)有很清楚的說(shuō)明白,或者你有更好的方式,那么歡迎加入左上方的2個(gè)交流群,我們一起學(xué)習(xí)探討。

3、你可以忘記點(diǎn)贊加關(guān)注,但千萬(wàn)不要忘記掃碼打賞哦。

下面是其他網(wǎng)友的補(bǔ)充:

你前面的插入,完全是拼字符串,沒(méi)有用到任何“參數(shù)”,每個(gè)語(yǔ)句SQL SERVER都要解析,沒(méi)有辦法緩存,當(dāng)然慢了;你可以嘗試用用參數(shù)化插入,相信也是幾秒就可以插入完

大批量數(shù)據(jù)插入,首選SqlBulkCopy

標(biāo)簽:新鄉(xiāng) 黃山 文山 東營(yíng) 濱州 大同 池州 來(lái)賓

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)》,本文關(guān)鍵詞  MSSQL,批量,插入,數(shù)據(jù),優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美高清视频不卡网| 久久综合九色综合97婷婷女人| 不卡的av在线播放| 国产伦精一区二区三区| 91麻豆国产福利在线观看| 国产午夜亚洲精品不卡 | 久久久久高清精品| 激情图区综合网| 精品国产乱码久久久久久1区2区 | 国产成人aaaa| 免费成人在线网站| 欧美专区亚洲专区| 精品成人私密视频| 亚洲另类色综合网站| 视频在线观看91| 欧美一区二区三区思思人| 国产精品天干天干在线综合| 久久精品一区四区| 欧美日韩在线免费视频| 亚洲一区二区三区四区五区黄| 成人手机电影网| 国产精品不卡视频| 色香蕉成人二区免费| 亚洲一区日韩精品中文字幕| 欧美精品丝袜久久久中文字幕| 男人的天堂久久精品| 国产偷国产偷精品高清尤物| 99免费精品在线| 亚洲18影院在线观看| 精品国产一区二区三区四区四| 国产高清成人在线| 亚洲激情av在线| 欧美一三区三区四区免费在线看| 国内欧美视频一区二区 | 日韩av在线发布| 欧美va日韩va| 一本一本大道香蕉久在线精品| 性感美女久久精品| 久久久久久久综合| 91麻豆精品国产无毒不卡在线观看| 久久精品国产亚洲一区二区三区| 国产日韩欧美精品综合| 欧美一区二区三区成人| 一区二区欧美国产| 成人性视频免费网站| 久久久99精品免费观看不卡| 91国产成人在线| 美腿丝袜在线亚洲一区| 国产女人aaa级久久久级 | 国产**成人网毛片九色| 国产精品69毛片高清亚洲| 一区二区三区四区高清精品免费观看 | 国产蜜臀97一区二区三区| 国产a精品视频| 亚洲欧美日韩在线| 欧美α欧美αv大片| 欧美又粗又大又爽| 国产精品18久久久久久久久久久久 | 国产亚洲精品资源在线26u| 欧美精品久久一区二区三区| 北条麻妃国产九九精品视频| 亚洲国产美国国产综合一区二区| 欧美大胆人体bbbb| 色偷偷成人一区二区三区91| 日本伊人色综合网| 午夜精品久久久久久久久久 | 久久嫩草精品久久久精品一| 91网上在线视频| 久久电影网站中文字幕| 五月婷婷激情综合网| 久久蜜桃av一区二区天堂| 色婷婷精品久久二区二区蜜臀av| 国产一区二区三区美女| 午夜电影一区二区| 亚洲无线码一区二区三区| 成人免费在线播放视频| 国产清纯在线一区二区www| 成人综合婷婷国产精品久久蜜臀 | 97久久超碰精品国产| 岛国精品一区二区| 不卡的av中国片| www.欧美日韩国产在线| 国产成人综合网站| 成人一区二区三区在线观看| 国产福利一区在线| 国产不卡免费视频| 成人免费视频一区| 色综合久久久久综合体| 色婷婷av久久久久久久| 亚洲伦在线观看| 91精品国产黑色紧身裤美女| 欧美精品一卡两卡| 51午夜精品国产| 日韩色在线观看| 国产丝袜美腿一区二区三区| 精品1区2区在线观看| 亚洲精品一区二区三区四区高清| 久久精品人人做| 色婷婷久久久亚洲一区二区三区| 国产一区二区影院| 91网站在线观看视频| 欧美日韩成人综合天天影院| 欧美一区二区久久| 亚洲五码中文字幕| 93久久精品日日躁夜夜躁欧美| 午夜av一区二区三区| 欧美xingq一区二区| 日韩理论片一区二区| a亚洲天堂av| 国产精品乱码人人做人人爱 | 精品电影一区二区三区 | 精品中文av资源站在线观看| 日韩精品专区在线影院重磅| 国产一本一道久久香蕉| 亚洲欧洲av一区二区三区久久| 3d成人动漫网站| 中文字幕不卡在线| 亚洲欧美自拍偷拍色图| 26uuu色噜噜精品一区| 韩国女主播成人在线观看| 日韩手机在线导航| 国产高清一区日本| 亚洲精品视频免费看| 欧美日韩国产高清一区二区三区| 午夜免费久久看| 久久久99久久| 亚洲人成网站精品片在线观看| 国产精品中文字幕日韩精品| 国产成人午夜99999| 亚洲人精品一区| 在线观看中文字幕不卡| 日韩国产在线一| 国产精品美女久久福利网站| 福利一区福利二区| 亚洲图片激情小说| 色综合久久精品| 亚洲 欧美综合在线网络| 精品福利在线导航| 一本到高清视频免费精品| 日本麻豆一区二区三区视频| 国产清纯白嫩初高生在线观看91| 91亚洲国产成人精品一区二区三 | 亚洲国产精品久久艾草纯爱| 日韩精品资源二区在线| 日本福利一区二区| 久久66热re国产| 另类中文字幕网| 一本色道久久加勒比精品| 日韩欧美国产小视频| 五月婷婷久久综合| 91久久免费观看| 国产欧美一区二区三区网站| 奇米一区二区三区av| 51久久夜色精品国产麻豆| 26uuu色噜噜精品一区二区| 中文字幕一区二区三区在线观看| 久久国产精品99久久人人澡| 欧美高清在线视频| 91精品国产黑色紧身裤美女| 不卡欧美aaaaa| 久草这里只有精品视频| 亚洲国产成人精品视频| 欧美三级电影精品| 天天综合网 天天综合色| 欧美变态口味重另类| 欧美日韩大陆在线| 欧美日韩和欧美的一区二区| 色综合天天综合狠狠| 蜜乳av一区二区| 日本在线不卡视频| 午夜视频在线观看一区| 亚洲免费色视频| 亚洲青青青在线视频| 国产精品电影一区二区| 国产精品丝袜久久久久久app| 日韩欧美第一区| 韩国毛片一区二区三区| 国产精品一二三区| 午夜精品福利一区二区三区av | 夜夜精品浪潮av一区二区三区| 成人免费视频免费观看| 亚洲黄网站在线观看| 中文字幕一区二区在线播放| 亚洲一二三区在线观看| 波多野结衣在线一区| 国产成人欧美日韩在线电影| 极品美女销魂一区二区三区 | 午夜电影一区二区三区| av资源网一区| 亚洲一区二区3| 中文字幕第一区| 亚洲成人免费影院| 亚洲国产日日夜夜| 亚洲成人免费电影| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品成人悠悠色影视| 一区二区三区四区五区视频在线观看 | 欧美xxxxx裸体时装秀| 理论片日本一区| 在线免费不卡电影|