<optgroup id="r9hwm"></optgroup><nav id="r9hwm"><label id="r9hwm"></label></nav>

    <tt id="r9hwm"><tr id="r9hwm"></tr></tt>
  1. 
    
  2. <optgroup id="r9hwm"><samp id="r9hwm"><dl id="r9hwm"></dl></samp></optgroup>

  3. <optgroup id="r9hwm"><samp id="r9hwm"><dl id="r9hwm"></dl></samp></optgroup>

        1. <listing id="r9hwm"></listing>
          <delect id="r9hwm"></delect>
          <optgroup id="r9hwm"><samp id="r9hwm"><ol id="r9hwm"></ol></samp></optgroup>

          sql語句是如何執行的

          SQL 語句在數據庫中是怎樣執行的

          第一步:應用程序把查詢SQL語句發給服務器端執行 我們在數據層執行SQL語句時,應用程序會連接到相應的數據庫服務器,把SQL語句發送給服務器處理。

          第二步:服務器解析請求的SQL語句 SQL計劃緩存,經常用查詢分析器的朋友大概都知道這樣一個事實,往往一個查詢語句在第一次運行的時候需要執行特別長的時間,但是如果你馬上或者在一定時間內運行同樣的語句,會在很短的時間內返回查詢結果。原因是: 服務器在接收到查詢請求后,并不會馬上去數據庫查詢,而是在數據庫中的計劃緩存中找是否有相對應的執行計劃。

          如果存在,就直接調用已經編譯好的執行計劃,節省了執行計劃的編譯時間。如果所查詢的行已經存在于數據緩沖存儲區中,就不用查詢物理文件了,而是從緩存中取數據,這樣從內存中取數據就會比從硬盤上讀取數據快很多,提高了查詢效率。

          數據緩沖存儲區會在后面提到。如果在SQL計劃緩存中沒有對應的執行計劃,服務器首先會對用戶請求的SQL語句進行語法效驗,如果有語法錯誤,服務器會結束查詢操作,并用返回相應的錯誤信息給調用它的應用程序。

          注意:此時返回的錯誤信息中,只會包含基本的語法錯誤信息,例如select 寫成selec等,錯誤信息中如果包含一列表中本沒有的列,此時服務器是不會檢查出來的,因為只是語法驗證,語義是否正確放在下一步進行。 語法符合后,就開始驗證它的語義是否正確。

          例如,表名、列名、存儲過程等等數據庫對象是否真正存在,如果發現有不存在的,就會報錯給應用程序,同時結束查詢。 接下來就是獲得對象的解析鎖,我們在查詢一個表時,首先服務器會對這個對象加鎖,這是為了保證數據的統一性,如果不加鎖,此時有數據插入,但因為沒有加鎖的原因,查詢已經將這條記錄讀入,而有的插入會因為事務的失敗會回滾,就會形成臟讀的現象。

          接下來就是對數據庫用戶權限的驗證。SQL語句語法,語義都正確,此時并不一定能夠得到查詢結果,如果數據庫用戶沒有相應的訪問權限,服務器會報出權限不足的錯誤給應用程序,在稍大的項目中,往往一個項目里面會包含好幾個數據庫連接串,這些數據庫用戶具有不同的權限,有的是只讀權限,有的是只寫權限,有的是可讀可寫,根據不同的操作選取不同的用戶來執行。

          稍微不注意,無論你的SQL語句寫的多么完善,完美無缺都沒用。 解析的最后一步,就是確定最終的執行計劃。

          當語法、語義、權限都驗證后,服務器并不會馬上給你返回結果,而是會針對你的SQL進行優化,選擇不同的查詢算法以最高效的形式返回給應用程序。例如在做表聯合查詢時,服務器會根據開銷成本來最終決定采用hash join,merge join ,還是loop join,采用哪一個索引會更高效等等。

          不過它的自動化優化是有限的,要想寫出高效的查詢SQL還是要優化自己的SQL查詢語句。 當確定好執行計劃后,就會把這個執行計劃保存到SQL計劃緩存中,下次在有相同的執行請求時,就直接從計劃緩存中取,避免重新編譯執行計劃。

          第三步:語句執行 服務器對SQL語句解析完成后,服務器才會知道這條語句到底表態了什么意思,接下來才會真正的執行SQL語句。 此時分兩種情況: 如果查詢語句所包含的數據行已經讀取到數據緩沖存儲區的話,服務器會直接從數據緩沖存儲區中讀取數據返回給應用程序,避免了從物理文件中讀取,提高查詢速度。

          如果數據行沒有在數據緩沖存儲區中,則會從物理文件中讀取記錄返回給應用程序,同時把數據行寫入數據緩沖存儲區中,供下次使用。說明:SQL緩存分好幾種,這里有興趣的朋友可以去搜索一下。

          有時因為緩存的存在,使得我們很難馬上看出優化的結果,因為第二次執行因為有緩存的存在,會特別快速,所以一般都是先消除緩存,然后比較優化前后的性能表現,這里有幾個常用的方法: 1 DBCC DROPCLEANBUFFERS 2 從緩沖池中刪除所有清除緩沖區。 3 DBCC FREEPROCCACHE 4 從過程緩存中刪除所有元素。

          5 DBCC FREESYSTEMCACHE 6 從所有緩存中釋放所有未使用的緩存條目。 SQL Server 2005 數據庫引擎會事先在后臺清理未使用的緩存條目,以使內存可用于當前條目。

          但是,可以使用此命令從所有緩存中手動刪除未使用的條目。 這只能基本消除SQL緩存的影響,目前好像沒有完全消除緩存的方案,如果大家有,請指教。

          執行順序: FROM 子句返回初始結果集。WHERE 子句排除不滿足搜索條件的行。

          GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個唯一值的組中。選擇列表中指定的聚合函數可以計算各組的匯總值。

          此外,HAVING 子句排除不滿足搜索條件的行。計算所有的表達式;使用order by對結果集進行排序。

          查找你要搜索的字段。

          SQL語句是按什么順序執行的

          分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。

          接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。 最后形成一張我們要的虛表。

          其它的先不說了,只說WHERE。 WHERE關鍵字后面的是條件表達式。

          如果學過C語言等編程語言就會知道,條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE后面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。

          例: SELECT * FROM STUDENT WHERE SNO = '1'; 分析器先找到關鍵字SELECT,然后跳到FROM關鍵字將STUDENT表導入內存,并通過指針p1找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,p1再指向下一條記錄。 如果為假那么p1直接指向下一條記錄,而不進行其它操作。

          一直檢索完整個表,關把虛表返回給用戶。 再說EXISTS謂詞,EXISTS謂詞也是條件表達式的一部分。

          當然它也有一個返回值(true或false)。 例: SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC。

          Sno = Student。Sno AND SC。

          Cno = '1'); 這是一個SQL語句的嵌套使用,但和上面說的SQL語句的執行過程也是相同的。嵌套的意思也就是說當分析主SQL語句(外面的那個SELECT,我們權且先這么叫它)到WHERE關鍵字的時候,又進入了另一個SQL語句中。

          那么也就是說,分析器先找到表Student并裝入內存,一個指針(例如p1)指向Student表中的第一條記錄。然后進入WHERE里分析里面的SQL語句,再把SC表裝入內存,另一個指針(例如p2)指向SC表中的第一條記錄,分析WHERE后面的條件表達式,依次進行分析,最后分析出一個虛表2,也就變成 SELECT Sname FROM Student WHERE EXISTS 虛表2 如果虛表為空表,EXISTS 虛表2 也就為false,不返回到SELECT,而p1指向下一條記錄。

          如果虛表2不為空也就是有記錄,那么EXISTS 虛表2 為true同,返回到SELECT并把p1指向的記錄添加到主SQL語句的虛表1當中。

          SQL語句到底是怎么執行的

          下面先給出上面的SQL語句的執行順序,然后進行講解:(8) select (9) distinct (11) top 1(6) *,COUNT(*) as nameCount (1) from Table1(3) inner join Table2(2) on *=*(4) where *(5) group by *(7) having *(10) order by * desc 紅色序號給出了執行的順序:(1)from:對Table1和Table2執行笛卡爾積,也就是兩個表的行的各種組合,共5*5=25行,生成虛擬表VT1(2)on:選擇VT1中的那些*=*的所有行,生成虛擬表VT2。

          (3)inner join:這里是內部連接,直接就是VT2,如果是outer join,如left join、right join、full join,那么還需要按照外部連接的規則,把VT1中沒有匹配的行添加到VT2,生成VT3.(4)where:選出VT3中*(5)group by:按照*進行分組。(6)COUNT:執行聚合函數,選出對應*的行數,生成的結果給虛擬表VT5(7)having:選擇VT5中*(8)select:選擇VT6中相應的列,給虛擬表VT7(9)distinct:將VT7中重復的行去除,生成VT8(10)order by:將VT8的結果按照*進行排序,這里沒有生成一個新的表VT9,而是生成游標VC9。

          (11)top:從游標VC9的開始處選擇指定的行數,這里是1行,生成虛擬表VT10. 經過上面的過程,最終的SQL語句將VT10返回給用戶使用。所以以后再寫SQL語句的時候,可以按照上面的順序寫SQL語句了,讀SQL語句也可以按照上面的順序去讀,做到心里明白。

          怎樣優化SQL語句的執行

          環境:oracle 817 + linux + 陣列柜 swd_billdetail 表5000萬條數據 SUPER_USER 表2800條數據 連接列上都有索引,而且super_user中的一條對應于swd_billdetail表中的很多條記錄表與索引都做了分析。

          實際應用的查詢為: select a。CHANNEL, B。

          user_class from swd_billdetail B, SUPER_USER A where A。cn = B。

          cn; 這樣在分析時導致查詢出的數據過多,不方便,所以用count(a。 CHANNEL||B。

          user_class)來代替,而且count(a。CHANNEL||B。

          user_class)操作本身并不占用過多的時間,所以可以接受此種替代。 利用索引查詢出SWD_BILLDETAIL表中所有記錄的方法 SQL> select count(id) from SWD_BILLDETAIL; COUNT(ID) ---------- 53923574 Elapsed: 00:02:166。

          00 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=18051 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'SYS_C001851' (UNIQUE) (Cost=18051 Card=54863946) Statistics ---------------------------------------------------------- 0 recursive calls 1952 db block gets 158776 consistent gets 158779 physical reads 1004 redo size 295 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 利用全表掃描從SWD_BILLDETAIL表中取出全部數據的方法。 SQL> select count(user_class) from swd_billdetail; COUNT(USER_CLASS) ----------------- 53923574 Elapsed: 00:11:703。

          07 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=165412 Card=1 Bytes=2) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'SWD_BILLDETAIL' (Cost=165412 Card=54863946 Bytes=109727892) Statistics ---------------------------------------------------------- 0 recursive calls 8823 db block gets 1431070 consistent gets 1419520 physical reads 0 redo size 303 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed select count(a。 CHANNEL||B。

          user_class) from swd_billdetail B, SUPER_USER A where A。cn = B。

          cn; EXEC_ORDER PLANLINE ---------- ----------------------------------------------------------------------------------------------------------- 6 SELECT STATEMENT OPT_MODE:CHOOSE (COST=108968,CARD=1,BYTES=21) 5 SORT (AGGREGATE) (COST=,CARD=1,BYTES=21) 4 NESTED LOOPS (COST=108968,CARD=1213745,BYTES=25488645) 1 TABLE ACCESS (FULL) OF 'SWORD。 SUPER_USER' (COST=2,CARD=2794,BYTES=27940) 3 TABLE ACCESS (BY INDEX ROWID) OF 'SWORD。

          SWD_BILLDETAIL' (COST=39,CARD=54863946,BYTES=603503406) 2 INDEX (RANGE SCAN) OF 'SWORD。 IDX_DETAIL_CN' (NON-UNIQUE) (COST=3,CARD=54863946,BYTES=) 這個查詢耗費的時間很長,需要1個多小時。

          運行后的信息如下: COUNT(A。CHANNEL||B。

          USER_CLASS) ------------------------------ 1186387 Elapsed: 01:107:6429。 87 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=108968 Card=1 Bytes=21) 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS (Cost=108968 Card=1213745 Bytes=25488645) 3 2 TABLE ACCESS (FULL) OF 'SUPER_USER' (Cost=2 Card=2794Bytes=27940) 4 2 TABLE ACCESS (BY INDEX ROWID) OF 'SWD_BILLDETAIL' (Cost=39 Card=54863946 Bytes=603503406) 5 4 INDEX (RANGE SCAN) OF 'IDX_DETAIL_CN' (NON-UNIQUE) (Cost=3 Card=54863946) Statistics ---------------------------------------------------------- 0 recursive calls 4 db block gets 1196954 consistent gets 1165726 physical reads 0 redo size 316 bytes sent via SQL*Net to client 421 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1 rows processed 將語句中加入hints,讓oracle的優化器使用嵌套循環,并且大表作為驅動表,生成新的執行計劃: select /*+ ORDERED USE_NL(A) */ count(a。

          CHANNEL||B。user_class) from swd_billdetail B, SUPER_USER A where A。

          cn = B。cn; EXEC_ORDER PLANLINE ---------- ----------------------------------------------------------------------------------------------------- 6 SELECT STATEMENT OPT_MODE:CHOOSE (COST=109893304,CARD=1,BYTES=21) 5 SORT (AGGREGATE) (COST=,CARD=1,BYTES=21) 4 NESTED LOOPS (COST=109893304,CARD=1213745,BYTES=25488645) 1 TABLE ACCESS (FULL) OF 'SWORD。

          SWD_BILLDETAIL' (COST=165412,CARD=54863946,BYTES=603503406) 3 TABLE ACCESS (BY INDEX ROWID) OF 'SWORD。SUPER_USER。

          幫忙解釋一下這段sql數據庫語句是怎樣執行的?執行的過程是什么??

          select * from OrderItem where OrderItem.顧客號=Customer.顧客號 and OrderItem.商品號=Article.商品號 把這個先定義為A,這個表示顧客購買了商品select * from Article where not exists A 定義為B,這個表示沒有被購買的商品select Customer.顧客號,顧客名 from Customer where not exists B這個就清楚多了,顧客沒有未購買的商品,那就是顧客買了所有商品。

          如何獲得執行后的SQL語句

          如果sql是在程序中直接寫的,那就簡單,全局變量就好

          如果sql實在數據庫中的,那么可以考慮將sql存入表中,并存儲相應的需要的信息,生成一個類似的日志表,在程序中讀取就行,此方式在程序中也適用

          如:

          declare @sql varchar(2000) = 'select * from tb'

          exec(@sql)

          insert into [日志表](sql_text)

          values(@sql)

          如何計算SQL語句執行時間

          一、按照*及CSDN等搜索結果 在SQL語句前面加上了這一句: 經查詢,SET STATISTICS TIME ON命令報告下面的查詢的實際占用時間和CPU使用情況。

          使用后覺得給出的時間很細致,跟執行過程結合的很緊密,但是比較多,似乎不夠精確。 二、CNBLOGS網友的文章里 Code use northwind declare @date1 datetime declare @date2 datetime select @date1=getdate() --測試語句 select * from employees select @date2=getdate()。

          如何直接執行SQL語句

          using (SqlConnection con = new SqlConnection(*tionStrings["default"].ConnectionString))

          { SqlCommand cmd = new SqlCommand();

          *tion = con;

          sqlStr = @"";

          *dText = sqlStr ;

          *dType = *;

          gs = *eNonQuery(); }

          這個就是直接執行sql語句的代碼!

          轉載請注明出處華閱文章網 » sql語句是如何執行的

          短句

          青年的語句

          閱讀(330)

          關于青春的句子例如:生活,生下來,活下去這種格式的"青春"的句1、這就是青春:充滿著力量,充滿著期待、志愿,充滿著求知和斗爭的志向,充滿著希望、信心的青春. 2、青春啊,永遠是美好的,可是真正的青春,只屬于這些永遠力爭上游的人,永遠忘我勞動的

          短句

          for語句的執行順序

          閱讀(851)

          for語句的一般形式及執行過程,急 for語句的一般形式為:for(單次表達式;條件表達式;末尾循環體){中間循環體;}。 for循環執行時,會先判斷條件表達式是否成立,如果條件成立則執行中間循環體,執行完中間循環體后接著執行末尾循環體 。在執行完末尾

          短句

          查詢多表的sql語句

          閱讀(396)

          SQL多表查詢多個字段 數據庫有好幾個表,查詢數據有幾種方法,假定數據結構為:id,字段1,字段2,字段3,其他字段數據表分別為 table1,table2,table31、將三個表的不同的數據合并 sel

          短句

          傷感經典語句

          閱讀(358)

          【讓人感動得痛哭流涕的經典句子你流淚了嗎】 不是人生缺乏感動,而是我們在茫茫塵世中、在物欲橫流的時代已然對感動漠然.有時候,一花、一鳥、一石,或許一笑、一點頭、一抿嘴

          短句

          c輸入語句

          閱讀(314)

          C語言輸入輸出語句 c語言輸入輸出函數 C語言輸入輸出函數有很多,標準 I/O 函數中包含了如下幾個常用的函數:scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs

          短句

          if語句的邏輯

          閱讀(495)

          C++中if語句和邏輯或的用法 能這樣用,這樣用編譯器也不會報錯,但是如你所說,這么寫么有意義,條件結果始終都為true。邏輯||或者邏輯&&一般使用的都是變量,真正寫代碼,是沒有人會寫常量的,只有寫為變量,根據變量不同的值,才既可能有true,又可能有f

          短句

          用if的循環語句

          閱讀(393)

          c語言 for循環語句 if語句 #include #include main(){int x[28];int d,d1,d2,d3;int i,flag;float sum=0;for (i=0;isrand((unsigned)time(NULL));

          短句

          定義數組的語句是

          閱讀(383)

          以下正確的數組定義語句是()A int y[1][4]={1,2,3,4,5,} B float x[3][]={{1 這個題在于對二維數組的理解。二維數組即是A[m][n]表示一個m行n列的數組,數組種元素的個數是m*n

          短句

          友情的語句

          閱讀(364)

          關于友誼的句子 我深深地理解,耗費了多少時間,戰勝了多少困難,你才取得眼前的成績。請你相信,在你追求、拼搏和苦干的過程中,我將永遠面帶微笑地站在你的身旁。 當你孤獨時,風兒就是我的歌聲,愿它能使你得到片刻的安慰;當你驕傲時,雨點就是我的

          短句

          oracle的循環語句

          閱讀(345)

          Oracle循環語句的寫法有哪些呢如果您對Oracle循環語句方面感興趣的話,不妨一看。 loop循環: 1。 create or replace procedure pro_test_loop is 2。 i number; 3。 begin 4。 i:=

          短句

          if語句講解

          閱讀(404)

          求助 1.if語句的一般格式 if(表達式) {語句組1;} [else {語句組2;} ](1)if語句中的“表達式”必須用“(”和“)”括起來。(2)else子句(可選)是if語句的一部分,必須與if配對使用,不

          短句

          cif語句的嵌套

          閱讀(323)

          C語言if語句的嵌套 和 提供一些關于if else的小程序 三、if--else if--else結構。if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; . . . else 語句n; 這種結構是從上到

          短句

          英語句子大學

          閱讀(337)

          關于大學的英語句子 大學英語勵志句子:1. Judge not from appearances 人不可貌相,海不可斗量。2. Don't give up and don't give in 不要放棄,不要言敗!3. Failure is the mo

          短句

          sql或語句怎么寫

          閱讀(392)

          sql語句寫法- 這個sql語句怎么寫 謝謝 如果要用一條語句查出來還是很麻煩的,上面兩個肯定不對。 select table1.roomID,table1.existNum,(table1.existNum - tem.occuNum) as arriv

          短句

          青年的語句

          閱讀(330)

          關于青春的句子例如:生活,生下來,活下去這種格式的"青春"的句1、這就是青春:充滿著力量,充滿著期待、志愿,充滿著求知和斗爭的志向,充滿著希望、信心的青春. 2、青春啊,永遠是美好的,可是真正的青春,只屬于這些永遠力爭上游的人,永遠忘我勞動的

          短句

          for語句的執行順序

          閱讀(851)

          for語句的一般形式及執行過程,急 for語句的一般形式為:for(單次表達式;條件表達式;末尾循環體){中間循環體;}。 for循環執行時,會先判斷條件表達式是否成立,如果條件成立則執行中間循環體,執行完中間循環體后接著執行末尾循環體 。在執行完末尾

          短句

          傷感經典語句

          閱讀(358)

          【讓人感動得痛哭流涕的經典句子你流淚了嗎】 不是人生缺乏感動,而是我們在茫茫塵世中、在物欲橫流的時代已然對感動漠然.有時候,一花、一鳥、一石,或許一笑、一點頭、一抿嘴

          短句

          查詢多表的sql語句

          閱讀(396)

          SQL多表查詢多個字段 數據庫有好幾個表,查詢數據有幾種方法,假定數據結構為:id,字段1,字段2,字段3,其他字段數據表分別為 table1,table2,table31、將三個表的不同的數據合并 sel

          短句

          if語句的邏輯

          閱讀(495)

          C++中if語句和邏輯或的用法 能這樣用,這樣用編譯器也不會報錯,但是如你所說,這么寫么有意義,條件結果始終都為true。邏輯||或者邏輯&&一般使用的都是變量,真正寫代碼,是沒有人會寫常量的,只有寫為變量,根據變量不同的值,才既可能有true,又可能有f

          短句

          c輸入語句

          閱讀(314)

          C語言輸入輸出語句 c語言輸入輸出函數 C語言輸入輸出函數有很多,標準 I/O 函數中包含了如下幾個常用的函數:scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs

          短句

          用if的循環語句

          閱讀(393)

          c語言 for循環語句 if語句 #include #include main(){int x[28];int d,d1,d2,d3;int i,flag;float sum=0;for (i=0;isrand((unsigned)time(NULL));

          短句

          流行的語句

          閱讀(384)

          網絡流行的十大句子No.1 神馬都是浮云出處:“神馬都是浮云”乃是“什么都是浮云”的諧音,意思是什么都不值得一提。而這一句式的流行則源于國慶期間紅遍網絡“小月月”事件,“小月月”以極其詭異的言行雷倒眾生。“神馬”和“浮云”的神奇

          <optgroup id="r9hwm"></optgroup><nav id="r9hwm"><label id="r9hwm"></label></nav>

            <tt id="r9hwm"><tr id="r9hwm"></tr></tt>
          1. 
            
          2. <optgroup id="r9hwm"><samp id="r9hwm"><dl id="r9hwm"></dl></samp></optgroup>

          3. <optgroup id="r9hwm"><samp id="r9hwm"><dl id="r9hwm"></dl></samp></optgroup>

                1. <listing id="r9hwm"></listing>
                  <delect id="r9hwm"></delect>
                  <optgroup id="r9hwm"><samp id="r9hwm"><ol id="r9hwm"></ol></samp></optgroup>
                  亚洲丰满少妇xxxxx高潮