日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > SQL Server > 正文

MSSQL批量插入數據優化詳細

2024-08-31 01:04:59
字體:
來源:轉載
供稿:網友

需求

 現在有一個需求是將10w條數據插入到MSSQL數據庫中,表結構如下,你會怎么做,你感覺插入10W條數據插入到MSSQL如下的表中需要多久呢?

或者你的批量數據是如何插入的呢?我今天就此問題做個探討。

MSSQL,批量插入

壓測mvc的http接口看下數據

首先說下這里只是做個參照,來理解插入數據庫的性能狀況,與開篇的需求無半毛錢關系。

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;      }    }

壓測的此mvc接口單條數據插入數據庫的聚合數據圖。

用例這樣的:5000個請求分500個線程執行post請求接口。

MSSQL,批量插入

這個圖告訴我們,最慢的請求只用啦4毫秒。那么我們做個算法。

如開篇的需求來看,我們用最小的響應時間來計算。

那么插入10w條數據到數據庫需用時=100000*4毫秒,大致是6.67分鐘。那么我們奔著這個目標來做出插入方案。

最常見的insert做法

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

//執行數據條數    int cnt = 10 * 10000;    //要插入的數據    CustomerFeedbackEntity m = new CustomerFeedbackEntity() { BusType = 1, CustomerPhone = "1888888888", BackType = 1, Content = "123123dagvhkfhsdjk肯定會撒嬌繁華的撒嬌防護等級劃分噶哈蘇德高房價盛大開放" };    //第一種    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") + "開始循環執行:" + cnt + "條sql語句 ...");        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") + "時,執行:" + cnt + "條sql語句完成 ! 耗時:" + sw.ElapsedMilliseconds + "毫秒。");      }    }

執行結果如下:

MSSQL,批量插入

10w條數據,693906毫秒,11分鐘,有沒有感覺還行,或者還可以接受的。親們,我是吐血狀不說話,繼續寫,你們看MSSQL數據庫與.Net配合插入止于哪里?

點評下:

1、不停的創建與釋放sqlcommon對象,會有性能浪費。

2、不停的與數據庫建立連接,會有很大的性能損耗。

此2點還有執行結果告訴我們,此種方式不可取,即便這是我們最常見的數據插入方式。

那么我們針對以上兩點做優化,1、創建一次sqlcommon對象,只與數據庫建立一次連接。優化改造代碼如下:

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") + "開始循環拼接:" + cnt + "條sql語句 ...");        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") + "時,循環拼接:" + cnt + "條sql語句完成 ! 耗時:" + 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") + "開始執行:" + cnt + "條sql語句 ...");          cmd.ExecuteNonQuery();          Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "時,執行:" + cnt + "條sql語句完成 ! 耗時:" + sw1.ElapsedMilliseconds + "毫秒。");        }      }    }

執行結果如下:

MSSQL,批量插入

呀,好奇怪啊,為什么跟上一個方案沒有多大區別呢?

首先我們看下拼接這么長的sql語句是怎么在數據庫中是怎么執行的。

1、查看數據庫的連接情況

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、查看數據庫正在執行的sql語句

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 ,

點評:雖然看似得到啦優化,其實與上一個解決方案的執行過程幾乎是一樣的,所以就不用多說什么啦。

利于MSSQL數據庫的用戶自定義表類型做優化
依舊先上代碼,或許這樣你才能對用戶自定義表類型產生興趣。

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") + "開始循環插入內存表中:" + cnt + "條數據 ...");          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") + "時,循環插入內存表:" + cnt + "條數據完成 ! 耗時:" + 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") + "時,執行:" + cnt + "條數據的datatable的數據進數據庫 ! 耗時:" + sw1.ElapsedMilliseconds + "毫秒。");        }      }    }

運行結果:

MSSQL,批量插入

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

再來一遍

MSSQL,批量插入

再來一遍

MSSQL,批量插入

是的你沒有看錯,10w條數據,不到2秒。是不是迫不及待的要知道為什么?迫不及待的想知道我們用到的用戶自定義表類型是什么?

用戶自定義表類型

首先類型大家應該很容易理解,像int,varchar,bit等都是類型,那么這個表類型是個毛線呢?

其實他就是用戶可以自己定義一個表結構然后把他當作一個類型。

創建自定義類型的詳細文檔:https://msdn.microsoft.com/zh-cn/library/ms175007.aspx

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

然后就是如何用這個類型,他的使用就是作為表值參數來使用的。

使用表值參數,可以不必創建臨時表或許多參數,即可向 Transact-SQL 語句或例程(如存儲過程或函數)發送多行數據。

表值參數與 OLE DB 和 ODBC 中的參數數組類似,但具有更高的靈活性,且與 Transact-SQL 的集成更緊密。 表值參數的另一個優勢是能夠參與基于數據集的操作。

Transact-SQL 通過引用向例程傳遞表值參數,以避免創建輸入數據的副本。 可以使用表值參數創建和執行 Transact-SQL 例程,并且可以使用任何托管語言從 Transact-SQL 代碼、托管客戶端以及本機客戶端調用它們。

優點

就像其他參數一樣,表值參數的作用域也是存儲過程、函數或動態 Transact-SQL 文本。 同樣,表類型變量也與使用 DECLARE 語句創建的其他任何局部變量一樣具有作用域。 可以在動態 Transact-SQL 語句內聲明表值變量,并且可以將這些變量作為表值參數傳遞到存儲過程和函數。

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

首次從客戶端填充數據時,不獲取鎖。

提供簡單的編程模型。

允許在單個例程中包括復雜的業務邏輯。

減少到服務器的往返。

可以具有不同基數的表結構。

是強類型。

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

在用于存儲過程時像臨時表一樣被緩存。 從 SQL Server 2012 開始,對于參數化查詢,表值參數也被緩存。

限制

表值參數有下面的限制:

SQL Server 不維護表值參數列的統計信息。

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

不能將表值參數用作 SELECT INTO 或 INSERT EXEC 語句的目標。 表值參數可以在 SELECT INTO 的 FROM 子句中,也可以在 INSERT EXEC 字符串或存儲過程中。

常見的BULK INSERT 數據集插入優化

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") + "開始循環插入內存表中:" + cnt + "條數據 ...");        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") + "時,循環插入內存表:" + cnt + "條數據完成 ! 耗時:" + 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") + "時,執行:" + cnt + "條數據的datatable的數據進數據庫 ! 耗時:" + sw1.ElapsedMilliseconds + "毫秒。");      }

執行結果:

MSSQL,批量插入

MSSQL,批量插入

MSSQL,批量插入

MSSQL,批量插入

1秒之內完成,1秒之內完成,看完這個簡直要在1秒之內完成10w條數據的插入的節奏,逆天,逆天啊。

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

專業的點評:

表值參數的使用方法與其他基于數據集的變量的使用方法相似;但是,頻繁使用表值參數將比大型數據集要快。 大容量操作的啟動開銷比表值參數大,與之相比,表值參數在插入數目少于 1000 的行時具有很好的執行性能。

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

表值參數在執行性能上與對等的參數陣列實現相當甚至更好。

總結

接下來是大家最喜歡的總結內容啦,內容有三,如下:

1、希望能關注我其他的文章。

2、博客里面有沒有很清楚的說明白,或者你有更好的方式,那么歡迎加入左上方的2個交流群,我們一起學習探討。

3、你可以忘記點贊加關注,但千萬不要忘記掃碼打賞哦。

下面是其他網友的補充:

你前面的插入,完全是拼字符串,沒有用到任何“參數”,每個語句SQL SERVER都要解析,沒有辦法緩存,當然慢了;你可以嘗試用用參數化插入,相信也是幾秒就可以插入完

大批量數據插入,首選SqlBulkCopy

 

注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产www.大片在线| 亚洲一级影院| 91精品国产色综合久久久蜜香臀 | 欧美日韩国产黄色| 国产一区在线不卡| 中文字幕日韩高清| 亚洲免费福利视频| 欧美日韩国产在线观看| 久久99久久久久| 日韩亚洲欧美中文三级| 日韩精品在线播放| 一区二区日韩av| www中文字幕在线观看| 一级片免费网站| 中文字幕综合在线| 欧美日本精品在线| 国产一级免费看| 欧美成人一区二区| 免费在线观看国产黄| 精品国产91| 欧美日韩乱国产| 亚洲成年人影院在线 | 欧美日韩国产高清一区| 亚洲福利一区二区三区| 亚洲最新永久观看在线| 国产婷婷一区二区| 欧美日韩国产免费观看视频| 欧美日韩国产一区| 欧美日韩精品免费看| 99视频在线看| 欧洲精品久久久| 精品福利在线观看| 日韩视频在线免费播放| 国产精品一区二三区| 亚洲三级免费看| 国产欧美第一页| 日韩精品综合在线| 日韩欧美一级二级三级久久久| 精品国产乱码久久久久久牛牛| 欧美日韩视频不卡| 欧美专区中文字幕| 国产传媒久久久| 在线欧美日韩国产| 中文 欧美 日韩| 午夜av一区二区| 欧美亚洲另类制服自拍| 日韩免费精品视频| 黄色精品在线观看| 中文字幕亚洲字幕| 视频一区三区| 蜜臀国产一区| 午夜av一区二区| 亚洲a一级视频| 欧美一级免费在线观看| 国产小视频在线| 欧美日韩在线播放一区| 欧美日韩国产系列| 日韩欧美在线视频| 国产日韩精品在线| 国产欧美日韩在线观看| 一区二区精品区| 国产欧美中文字幕| 日韩三级在线播放| 国产日产一区二区| 欧美日韩综合色| 最新日韩中文字幕| 色综合影院在线| 亚洲欧洲日产国码av系列天堂| 一区二区三区视频网站| 日韩在线观看视频一区| 欧美色视频一区二区三区在线观看| 国产一卡2卡3卡四卡网站| 黄污视频在线看| 国产香蕉精品视频| 大香一本蕉伊线亚洲网| 精品一二三区视频| 尤物av一区二区| 亚洲综合在线中文字幕| 精品视频在线导航| 伊人永久在线| 欧美日韩视频在线| 中文字幕在线视频网| 日韩高清不卡在线| 精品国产31久久久久久| 成人a在线视频免费观看| 日韩高清不卡一区| 精品一二三四| 欧美日韩精品在线视频| 婷婷精品视频| 国产激情在线视频| 国产在线不卡一区| 久久久久久99精品| 亚洲欧洲日产国码av系列天堂| 国产欧美综合视频| 五月综合激情日本mⅴ| 国产网站av| 国产三级在线| 国产成人精品亚洲| 欧美日韩国产999| 樱花草www在线| 国产资源中文字幕| 国产一区免费视频| 一区二区三区精品久久久| 国产精品一区二三区| av免费在线观看网址| 日韩在线视频网| 中文字幕在线视频网| 中文字幕 亚洲视频| av一级在线| 一区二区三区精品久久久| 国产 欧美 日韩 在线| 92久久精品| 亚洲一区在线观看视频| 91精品国产自产观看在线| 亚洲午夜久久| 91精品在线免费| 国产黄在线看| 国产成人精品av久久| 国产农村妇女精品一二区| 国产视频1区2区| 91xxx在线观看| 欧美日韩性视频在线| 日韩视频 中文字幕| 精品福利在线观看| 亚洲电影中文字幕在线观看| 91精品国产自产在线丝袜啪| a视频免费在线观看| 国产乱国产乱300精品| 日韩欧美在线字幕| 精品视频1区2区3区| 国产欧美综合视频| 日本亚洲视频在线| 久久久另类综合| 丰满少妇一区| 欧美日韩国产免费观看视频| 日韩欧美在线网站| 亚洲欧洲三级| 国产中文伊人| 久久精品免费在线观看| 亚洲综合欧美在线| 国产激情三区| 91精品蜜臀在线一区尤物| 国产在线不卡一区| 日韩精品一页| 中文字幕在线播出| 91精品国产高清久久久久久| 精品日韩av| 中文字幕 亚洲视频| 最新日韩中文字幕| 亚洲一卡二卡在线观看| 一区二区三区精品在线| 国内精品露脸在线视频播放| 国产真实乱子伦精品视频| 欧美乱大交xxxxx免费| 久久精品一级爱片| av影视在线看| 国产xxx在线| 九一精品国产| 欧美日韩国产免费观看| 视频一区中文字幕国产| 欧美日韩在线观看首页| 在线看av的网址| 不卡一区2区| 成人xxxx| 欧美久久久久久蜜桃| 91精品日本| 91亚洲国产| 日韩三级精品| 日韩精品在线观看网站| 中文精品视频| 在线视频第一页| 欧美日韩在线视频免费观看| 欧美一级在线免费| 欧美日韩国产大片| 国产一级网站视频在线| 欧美日韩一级视频| 日韩 欧美 综合| 亚洲欧美久久234| 久久人人88| 亚洲va中文字幕| 欧美日韩色综合| 欧美不卡视频| 日本a口亚洲| 久久视频一区| 国产拍揄自揄精品视频麻豆| 日韩中文欧美在线| 亚洲乱码视频| 欧美一级免费观看| 久本草在线中文字幕亚洲欧美| 天天摸日日摸狠狠添| 97最新国自产拍视频在线完整在线看 | 日韩欧美一二三区| 国产高清不卡av| 精品久久人人做人人爽| 日韩中文字幕亚洲| 欧美日韩国产区| 中文字幕亚洲一区在线观看| 中文字幕久久av| 国产欧美综合视频| 国产成人精品日本亚洲专区61| 日本免费看黄| 欧美日韩视频网站| 日韩 国产 一区| 国产 欧美 日韩 在线| 国产欧美日韩中文字幕在线| 亚洲国产欧美91| 国产欧美日韩精品在线| 欧美日韩国产不卡| 999在线视频| 亚洲欧美日本另类| 久久久久久久久综合| 国产在线www| 在线欧美日韩精品| 精品综合久久久久| 国产婷婷精品| 午夜国产在线| 精品国产31久久久久久| www.日韩免费| 精品一二三四区| 久久精品国产99| 国产资源在线观看入口av| 婷婷综合福利| 欧美午夜影院在线视频| 日韩影院二区| 在线日韩欧美| 亚洲大片精品永久免费| 亚洲美女视频一区| 日韩中文字幕二区| 日韩视频在线免费播放| 免费在线国产| 日韩中文首页| 天天综合天天| 日韩精品在线免费观看| 婷婷精品视频| 日韩欧美三级| 欧美日韩在线不卡| 日韩精品中文在线观看| 一区二区高清在线| av手机天堂| 亚洲成av人片在线| 国产福利久久久| 日韩三区免费| 日韩激情一区| 国产 欧美 在线| 午夜伦欧美伦电影理论片| 亚洲 欧美 精品| 欧美日韩国产综合视频在线观看 | 中文官网资源新版中文第二页在线观看 | 999精品色在线播放| 欧美乱大交xxxxx另类| 一区二区三区精品在线观看| 国产黄色在线播放| av免费观看国产| 日韩视频精品在线| 天天摸日日摸狠狠添| 国产亚洲福利| 欧美日韩国产一中文字不卡| 精品日韩av| 黄色在线资源| 久草视频观看| 国产日韩精品在线| 亚洲二区自拍| xxxxx性| 高清日韩中文字幕| 久久久另类综合| 日韩欧美国产黄色| 欧美日韩国产高清一区| 国产一卡二卡3卡4卡四卡在线| 91精品国产综合久久香蕉最新版| 欧美亚洲专区| 亚洲一区日韩在线| 人成在线免费视频| 一区二区日韩免费看| 日韩一级二级三级| 日韩精品丝袜在线| 欧美日本精品在线| 欧美日韩三级在线| 91午夜在线| 日韩精品午夜| 亚洲欧美日本国产专区一区| 日本黄色一区二区三区| 欧美日韩精品不卡| 青青久在线视频免费观看| 一区在线视频观看| 三级精品视频| 欧美日韩国产不卡在线看| 精品国内自产拍在线视频| 欧美成人二区| 国产丝袜欧美中文另类| 久久精品一二三| 亚洲第一网中文字幕| 欧美日韩中文字幕| 欧美日韩国产一区在线| 午夜国产在线视频| 国产欧美久久久精品影院| 91精品国产乱码久久蜜臀| 精品久久在线观看| 精品乱人伦一区二区三区| 日韩三级高清在线| 日韩中文字幕在线视频观看| 视频在线一区二区| 国产中文在线播放| 日韩欧美中文第一页| 国产亚洲人成a一在线v站| 日韩欧美中文字幕在线播放| 久精品在线观看| 国产91欧美| 国产91久久久久蜜臀青青天草二| av高清一区| 国产 中文 字幕 日韩 在线| 国产激情三区| 日韩在线视频一区| 日韩www在线| 日韩国产91| 日韩欧美看国产| 欧美日韩乱国产| 91国内在线| av影视在线看| 精品视频123区在线观看| 国产三级在线观看视频| 中文字幕日韩高清| 久久精品女人| 欧美在线视频一区二区| 日韩精品在线中文字幕| 免费中文字幕日韩欧美| 成人精品视频一区| 日韩精品视频免费播放| 国内国产区免费视频| 久久夜色精品国产欧美乱极品| 日韩中文字幕视频在线观看| 国产一卡2卡3卡4卡网站免费| 91精品国产自产观看在线| 亚洲电影中文字幕在线观看| 日韩欧美中文视频| 国产无套粉嫩白浆在线2022年| 欧美日韩在线不卡一区| 视频一区二区国产| 欧美三级中文字幕| 99精品电影| 国产欧美日韩91| 欧美va亚洲va日韩∨a综合色| 日韩精品福利一区二区三区| 国产一区二中文字幕在线看| 欧美日韩99| 在线一区av| 亚洲综合日韩欧美| 91麻豆精品国产91久久久使用方法| 欧美1区免费| 国产综合成人久久大片91| 日韩中文字幕视频网| 日韩午夜黄色| 一区精品在线播放| 99精品人妻国产毛片| 蜜桃视频一日韩欧美专区| 国产h片在线观看| 国产在线视频一区二区| 欧美激情一区二区三区在线| 国产999在线观看| 不卡专区在线| 亚洲九九精品| 午夜国产福利在线观看| 日韩欧美在线网址| 1区2区3区在线视频| 99国产一区| 精品日韩av| 欧美日韩亚洲一| 日本a口亚洲| 欧美日韩在线中文字幕| 日韩精品免费观看视频| 久久久精品99| 国产欧美日韩综合精品| 成人一区二区不卡免费| a天堂在线资源| www.三级.com| 欧美日韩国产综合网| 久久精品免费在线观看| 日韩欧美在线网站| 色综合婷婷久久| 久久精品免费在线观看| 黄色片网站在线| 国产欧美第一页| 视频在线一区二区| 亚洲a中文字幕| 日本一级一片免费视频| 亚洲成在线观看| 日韩欧美国产免费| 中文字幕 亚洲一区| a在线观看免费视频| 精品国产99| 欧美日韩国产一区在线| av手机天堂| 日韩三级高清在线| 久久久久久久久综合| 国产一区高清视频| 日韩精品资源二区在线| 亚洲三级国产| 日韩亚洲欧美中文三级| 中文字幕4区| 91久久精品网| 伊人永久在线|