在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

Oracle Freelist與HWM原理探討及相關優化性能

Oracle Freelist與HWM原理探討及相關優化性能

更新時間:2025-10-15 文章作者:未知 信息來源:網絡 閱讀次數:

數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應...
數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。
關鍵詞:Freelist,HWM,存儲參數,段,塊,dump,優化
文章摘要:
   近期來,FreeList的重要作用逐漸為Oracle DBA所認識,網上也出現一些相關的討論。本文以FreeList為線索對Oracle的存儲管理的原理進行較深入的探討,涉及Oracle段區塊管理的原理,FreeList算法等。而與FreeList密切相關的一個重用特性HWM,與sql性能密切相關,本文也作了原理分析介紹。在原理探討的基礎上,介紹了常用的存儲參數分析方法,并對所涉及的存儲優化、HWM的優化和Freelist競爭優化作了說明。
縮略語:
       ASSM:auto segement space management
       HWM:high water mark
       DBA:data block address
       OLTP:online transaction process
       OPS:oracle parallel server
1.簡介
       Oracle的空間管理和存儲參數管理是Oracle管理及優化的重要部分。FreeList作為Oracle底層存儲參數中的核心參數,其行為方式對Oracle的存儲管理及性能優化有重大影響,而現有的Oracle文檔對此方面的內容比較缺乏。雖然Oracle 9i已出現了ASSM,但是作為深入調優對FreeList認識仍是必要的。
   近期來,FreeList的重要作用逐漸為Oracle DBA所認識,網上也出現一些相關的討論。本文以FreeList為線索對Oracle的存儲管理的原理進行較深入的探討,涉及Oracle段區塊管理的原理,FreeList算法等。而與FreeList密切相關的一個重用特性HWM,與sql性能密切相關,本文也作了原理分析介紹。在原理探討的基礎上,介紹了常用的存儲參數分析方法,并對所涉及的存儲優化、HWM的優化和Freelist競爭優化作了說明。
       這些原理分析和性能優化都建立在探討的基礎上,限于篇幅和本人經驗可能存在局限、偏差或謬誤。
       為了準確文中部分結構和字段的說明直接用英文描述。
       限于篇幅本文不對同樣很重要的block結構作更深入的討論,對OPS性能有重要影響的free list group本文也未提及,因此本文在單一free list group下討論。對于block的深入討論、free list group的介紹與優化以及PCTUSED和PCTFREE等重要參數的優化請參見參考文獻和資料。
2.原理探討
       FreeList作為一個Oracle存儲管理的核心參數。其行為方式由Oralce內部控制,我們一般不需要掌握和控制。但是我們可能會遇到這些問題,當插入一條記錄,會插入到那個塊中?是使用新塊,還是插入有數據的老塊?段是什么時候擴展的,如何擴展的?表中只有一條記錄,但是作一次select時代價卻是上千個塊,為什么?如果我們從原理上清楚了Oracle的存儲管理方式,對相關這些問題的解決及性能優化就清晰自然了。
2.1 Oracle的邏輯儲存結構
       Oralce的邏輯存儲結構按表空間,段,區,塊進行管理。塊是Oracle用來管理存儲空間的最基本單元,Oracle數據庫在進行輸入輸出操作時,都是以塊為單位進行邏輯讀寫操作的。區由一系列連續的塊組成,Oralce在進行空間分配、回收和管理時是以區為基本單位的。段由多個區組成,這些區可以是連續的也可以是不連續的,一般情況下一個對象擁有一個段。表空間中容納段和區。
       在生成段的時候,會同時分配初始區(initial extents), 初始區的第一個塊就格式化為segment header,并被用來記錄free list描述信息、extents信息,HWM信息等。
2.2 free list概念
free list是一種單向鏈表用于定位可以接收數據的塊,在字典管理方式的表空間中,Oracle使用free list來管理未分配的存儲塊。Oracle記錄了有空閑空間的塊用于insert或Update。空閑空間來源于兩種方式:1.段中所有超過HWM的塊,這些塊已經分配給段了,但是還未被使用。2.段中所有在HWM下的且鏈入了free list的塊,可以被重用。free list具有下列屬性
l         flag指示free list 被使用(1)或未使用(0)
l         free list 鏈的首塊的地址DBA(data block address)
l         free list 鏈的尾塊的地址DBA
free list 的信息通常保留在segment header中,這里給出segment header block dump片段加以說明:
nfl = 3, nfb = 1 typ = 1 nxf = 0
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
SEG LST:: flg: USED   lhd: 0x03c00233 ltl: 0x03c00233 
SEG LST:: flg: USED   lhd: 0x03c00234 ltl: 0x03c00234 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
 
Segment Header:
==> nfl: number of free lists/block
==> nfb: number of free list blocks + segment header
==> typ: block type 
==> nxf: number of transaction free lists
Segment List:
==> flg: flag USED or UNUSED the free list
==> lhd: head of free list
==> ltl: tail of free list
 
在每一個塊中都有一個標記flg用來表明塊是否鏈入了 free list鏈中。如果這個標志置上,該塊中后向指針指向free list鏈中下一個塊的DBA。如果當前塊是鏈的最末尾的塊,該后向指針值為0。
這里給出位于free list上的block dump的片段
Block header dump:  0x03c00235
 Object id on Block? Y
 seg/obj: 0xe2d8  csc: 0x00.6264c61  itc: 1  flg: O  typ: 1 - DATA
     fsl: 1  fnx: 0x3c00234 ver: 0x01
 
==> Seg/obj Object ID in dictionary
==> csc SCN of last block cleanout 
==> itc Number of ITL slots
==> flg O = On freelist , - = Not on freelist
==> typ 1 = DATA    2 = INDEX
==> fsl ITL TX freelist slot
==> fnx DBA of NEXT block on freelist
 
舉例來說如果有五個塊在free list中,分別為A,B,C,D,E
就會形成segment header->A->B->C->D->E--|
同時segment header->E
2.3 free list類別
在段中存在3類free list, 即Master Freelists (MFL), Process Freelists (PrFL), 和 Transaction Freelists. 
2.3.1 Master Free List(公用空閑空間池): 
每一個段中有一個Master free list,在段創建的時候自動生成。對于每一個段來說都有這樣一個空閑空間池,對每個進程都是公用的,空閑空間就是位于master free list 的塊上。由于Master free list是公用的,因此當多個進程同時插入行到同一個段上,master free list競爭使用程度就會增加。
2.3.2 Process Free Lists
為了減少Master Free list的競爭問題, 引入了另一種free list叫做Process free lists, 根據sql命令 CREATE/ALTER 中的參數FREELISTS 創建. 這樣多個free list 就可以分攤空閑空間的管理,以提高OLTP應用作高度并發插入和更新事務時空間分配管理的性能。通過指定CREATE TABLE / CLUSTER or INDEX的子句STORAGE的參數FREELISTS 來創建,例如: CREATE TABLE flg ( . . . .) . . . STORAGE ( ... FREELISTS 10 ...)。缺省的FREELISTS為1,此時不會創建Process free lists。當FREELISTS>=2時,創建Process free lists。
    進程在使用process free list是根據進程的Oracle PID (Process ID)來選擇的,公式如下:
select list entry = (PID % NFL) + 1 
NFL : FREELISTS定義的Process free list個數
2.3.3 Transaction Free Lists
當Oracle需要時動態創建。一個Transaction Free List 是一種專門給某一個事務使用的free list. 每個段至少有16個transactions free lists, 并且這個值在需要時會增長,直到達到Segment Header塊的大小限制。一個事務只有下面情況下會需要分配一個Tx Free Lists entry: 塊中釋放空間時(DELETE or UPDATE) 并且還不存在Tx Free Lists entry時。 
2.4 Free list行為
2.4.1 Freelist Link and Unlink 操作
    Freelist 按后進先出隊列(LIFO) 方式管理。也就是說最后被link到freelist的塊擁有最先unlink的機會。
當塊中空閑空間增加到大于PCTFREE時,塊放入freelist中。free list中的塊可用來作update 或insert。 當塊中沒有足夠的空間用于insert操作時并且使用空間大于PCTUSED,塊就會從free list中移出。
在塊在DELETE or UPDATE 操作之后,如果使用空間落到PCTUSED下,塊再次link到free list中。每次塊加入free list時,都是link到鏈表的頭部。
例如:考慮段中有120個塊編號由1到120。其中有6個塊在free list上并假設HWM是 80。(block實際使用DBA編號)
10->24->45->46->65->80-|
現在作INSERT 操作,需要400 bytes空間。假設塊10上空間不足,但塊24上空間可用。現在數據插入到塊 24 ,現在塊24的剩余空間小于該表的PCTUSED。因此塊 24 從free list鏈表中移出。PCTFREE and PCTUSED參數的目的就是用來控制數據塊從free list的鏈表中移入/移出行為的。現在free lists象這樣:
10->45->46->65->80-|
然后在同一事務中作DELETE同一個段的數據,使塊 54 和 67落到PCTUSED下。現在這些塊加入到free list鏈中。free list鏈現在象這樣:
67->54->10->45->46->65->80-|
2.4.2 Transaction Free List 算法
掃描segment Header塊中所有的Tx free list,檢查是否還沒有Tx free list entry分配給transaction, 如何沒有,將尋找未使用的entry或已經提交了事務的空的Tx free list。如果上述搜索過程失敗, 新的entry會在segment Header塊中Tx free lists區域中開辟。如果沒有空間來生成, 事務就必須等待entry的釋放。
segment header中的最大free list個數:
Block Size    Max # Freelists 
-----------   ----------------- 
      2K      24 
      4K      50 
      8K      101 
     16k      204 
事務T1釋放出來的空閑塊(DELETE or UPDATE)的使用 : 
l         立即被T1所重用
l         當T1 commit后被其它需要空閑塊的事務重用,過程舉例如下: 

 
2.5 HMW概念
HIGH WATER MARK代表一個表使用的最大的(top limit)塊 。2.1中已經提到HIGH WATER MARK 記錄在segment header中,并且在Oracle插入數據時一般增長5個blocks(并非總是5個塊,具體參見2.4.2中流程圖中HMW增長方式)。
segment header block中與HWM相關信息說明如下:
EXTENT CONTROL:
  Extent Header:: spare1: 0      space2: 0      #extents: 13     #blocks: 1429  
                  last map  0x00000000  #maps: 0      offset: 4128  
      Highwater::  0x020004d0  ext#: 12     blk#: 275    ext size: 475   
  #blocks in seg. hdr’s freelists: 5     
  #blocks below: 1229     
  mapblk  0x00000000  offset: 12    
                   Unlocked
==> spare1:   this field is no longer used (old inc#, now always 0)
==> space2:   this field is no longer used (old ts#, now always 0)
==> #extents: number of extents allocated to segment
==> #blocks:  number of blocks allocated to segment
 
==> last map: address of last extent map block
              0 if extent map is entirely in the segment header
==> #maps:    number of extent map block
==> offset:   offset to end of extent map
 
==> HWM dba:  address of block at highwater mark
==> ext#:     HWM extent number relative to segment
==> blk#:     HWM block number within extent
==> ext size: HWM extent size (in blocks)
==> #blocks in seg. hdr’s freelists: number of blocks in seg. hdr’s free list 
==> #blocks below: number of blocks below HWM
==> mapblk dba: dba of extent map block containing HWM extent
                is 0 if HWM is in the segment header
==> offset:   offset within extent map block
              is the ext# if HWM is in segment header
==> Locked by: if locked by a transaction, the xid is displayed
 
HWM可以說是已經使用過的存儲空間和未使用過的存儲空間之間的分界線。在表使用過程中,HWM一直向一個方向移動,插入記錄時HWM可能會向增加的方向移動,但是刪除記錄時HWM并不會向相反的方向移動。參見2.4.2。下圖顯示了某個數據段中HWM的位置情況。
[page_break]

HIGH WATER MARK之所以重要是因為它對全表掃描性能的影響。當實施一個全表掃描時,Oracle會讀取所有HIGH WATER MARK下的塊即使它們是空塊。當HIGH WATER MARK 下有很多unused block時實施全表掃描會增加額外的不必要的I/O。它也會在全局共享區中填充很多很多空塊。

3.分析方法
    存儲參數基本上屬于oracle internal的東西,因此oralce并沒有提供很好的手段來分析。但是對于DBA來說,還是可以通過block dump和DBMS_SPACE等手段來獲取部分信息。

3.1 提取block和free list信息
創建dbms_space使用的存儲過程show_space

SQL>

create or replace procedure show_space

 ( p_segname in varchar2,

 p_owner in varchar2 default user,

 p_type in varchar2 default 'TABLE',

 p_partition in varchar2 default NULL )

 as

 l_free_blks number;

 l_total_blocks number;

 l_total_bytes number;

 l_unused_blocks number;

 l_unused_bytes number;

 l_LastUsedExtFileId number;

 l_LastUsedExtBlockId number;

 l_last_used_block number;

 procedure p( p_label in varchar2, p_num in number )

 is

 begin

 dbms_output.put_line( rpad(p_label,40,'.') || p_num );

 end;

 begin

 dbms_space.free_blocks

 ( segment_owner => p_owner,

 segment_name => p_segname,

 segment_type => p_type,

 partition_name => p_partition,

 freelist_group_id => 0,

 free_blks => l_free_blks );

dbms_space.unused_space

 ( segment_owner => p_owner,

 segment_name => p_segname,

 segment_type => p_type,

 partition_name => p_partition,

 total_blocks => l_total_blocks,

 total_bytes => l_total_bytes,

 unused_blocks => l_unused_blocks,

 unused_bytes => l_unused_bytes,

 last_used_extent_file_id => l_LastUsedExtFileId,

 last_used_extent_block_id => l_LastUsedExtBlockId,

 last_used_block => l_last_used_block );

p( 'Free Blocks', l_free_blks );

 p( 'Total Blocks', l_total_blocks );

 p( 'Total Bytes', l_total_bytes );

 p( 'Unused Blocks', l_unused_blocks );

 p( 'Unused Bytes', l_unused_bytes );

 p( 'Last Used Ext FileId', l_LastUsedExtFileId );

 p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );

 p( 'Last Used Block', l_last_used_block );

 end;

過程已創建。

SQL> create table t1(a char(1000)) storage( freelists 3);

表已創建。

SQL> set serveroutput on;

SQL> exec show_space('T1');

Free Blocks.............................0       <==Number of blocks on freelist

Total Blocks............................5       <==Total data blocks in segment

Total Bytes.............................20480   <==Total bytes in segment

Unused Blocks...........................4       <==Total unused blocks in segment

Unused Bytes............................16384   <==Total unused bytes in segment

Last Used Ext FileId....................15      <==File id of last used extent

Last Used Ext BlockId...................562     <==Block id of last used extent

Last Used Block.........................1       <==Last used block in extent

PL/SQL 過程已成功完成。

有關show_space的進一步使用技巧可參考文獻5。以下利用上面得到的數據對segment header block進行dump。

SQL>alter system dump datafile 15 block 562;

在udump/ora10792.trc中

*** 2004-09-08 15:29:57.343

Start dump data blocks tsn: 27 file#: 15 minblk 562 maxblk 562

buffer tsn: 27 rdba: 0x03c00232 (15/562)

scn: 0x0000.064560e4 seq: 0x02 flg: 0x00 tail: 0x60e41002

frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED

Extent Control Header

  -----------------------------------------------------------------

  Extent Header:: spare1: 0      space2: 0      #extents: 1      #blocks: 4    

                  last map  0x00000000  #maps: 0      offset: 2080 

      Highwater::  0x03c00233  ext#: 0      blk#: 0      ext size: 4    

  #blocks in seg. hdr's freelists: 0    

  #blocks below: 0    

  mapblk  0x00000000  offset: 0    

                   Unlocked

     Map Header:: next  0x00000000  #extents: 1    obj#: 60033  flag: 0x40000000

  Extent Map

  -----------------------------------------------------------------

   0x03c00233  length: 4    

 nfl = 3, nfb = 1 typ = 1 nxf = 0

  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

End dump data blocks tsn: 27 file#: 15 minblk 562 maxblk 562

 對于上述塊中字段的說明,以及相關試驗。由于篇幅所限,本文不再列舉。可參考文獻7。

對非segment header的data block的dump方法和上述類似。data block的結構和segment header block不一樣,如果需要了解,可查閱參考文獻和資料。

3.2 提取HWM信息
3.2.1 HWM位置
HWM位置按下面的公式計算:

    HWM = useed byte = Total Bytes - Unused Blocks

Total Bytes和Unused Blocks都可以用show_space提取。

還可以通過ANALYZE tables得到HWM信息. DBA_TABLES視圖中包含了可用于各表空間分析的列。其中blocks代表已使用過的塊即HWM,empty_blocks代表未使用的空間。

3.2.1 HWM下空間利用信息
要比較有數據行的塊的塊數和HIGH WATER MARK下總塊數,可以用下面的公式來展示HWM下未用空間的比例。

p = 1- r/h

r:有數據行的塊的塊數

h:HWM下的塊數.

r可以通過如下方法獲得:

Oracle7:

SELECT count(distinct substr(rowid, 15,4) || substr(rowid, 1,8) )  FROM schema.table;

Oracle8 and Oracle9:

SELECT count(distinct substr(rowid, 7,3) || substr(rowid, 10,6) )  FROM schema.table;

如果公式計算的結果 p是0,就不需要對表進行重建。如果結果p大于0,應該考慮系統狀況和應用需要來決定是否需要總組表。

4.優化
4.1手工回收存儲空間
在HIGH WATER MARK以上的塊對性能沒有影響,但是會耗費空間。如何空間大小是一個考慮的問題,就可以決定回收空塊。

假設表T1的存儲示意圖如圖2.5所示,使用ALTER TABLE ... DEALLOCATE UNUSED語句可以回收HWM以上的空間。比如:

alter table t1 deallocate unused;

回收后T1的存儲示意如圖4.1.1

    如果在ALTER TABLE ... DEALLOCATE UNUSED語句中使用了KEEP關鍵字,則可以在HWM之后保留指定大小的空閑空間,比如:

    alter table t1 deallocate unused keep 10K;

回收后T1的存儲示意如圖4.1.2

4.2刪減表
    根據3.2.1可以得到HWM以下塊的使用情況。如何p大于時,對全表掃描性能會產生影響,同時也會耗用空間。

如果能夠確認應用有良好的索引幾乎不會用到全表掃描,那么HIGH WATER MARK以下的空塊,盡管耗費了空間,不會對訪問產生影響。如果不能確定,那么就需要考慮刪減表。

    刪減表的操作將刪除表中所有的記錄,并且重置HWM標記。表在刪減之后將成為一個空表。

    在Oracle中刪減表只有如下的兩種辦法:

1.使用drop語句

    先使用drop語句刪除整個表,然后再重建這個表。在刪除-重建的過程中,與表相關的所有索引、完整性約束以及觸發器都會丟失,并且所有依賴于該表的對象都會變為INVALID狀態,同時原來爭對表的授權也會失效。因此采用這種方式刪除表中的記錄代價太大。

2.使用TRUNCATE語句

    TRUNCATE語句屬于DDL語句,不會產生任何回退信息,并且被立即自動提交。在執行TRUNCATE語句時不會影響到與被刪減表相關的任何數據庫對象與授權,也不會觸發表中所定義的觸發器。此外,在對標進行刪減時,HWM將重置,已經為表分配的存儲空間將被回收。

    在執行TRUNCATE語句時,可以通過drop storage子句和reuse storage子句來控制被釋放的區是否回收到表空間中。如何作在線系統的TRUNCATE,不希望表長時間鎖住,那么可以使用reuse storage子句,僅將HWM重置。

4.3 free list優化
free list 競爭出現在多個進程使用同一個free list并試圖同時修改free list頭部數據塊時。可以通過查詢視圖v$waitsate的class類型為data block 的記錄來檢查競爭情況。

產生data block類型競爭的主要原因是多個進程試圖同時修改free list頭部數據塊。 然而,它也會出現在當進程準備將塊讀入buffer cathe時,另一個進程需要訪問同一個塊。如果能在V$SESSION_WAIT中正好捕獲buffer busy waits,就可以通過查詢V$SESSION_WAIT中的P3來判定是那一類。A 0 或 1014代表讀類型,其他的值為修改競爭的類型。

   下一步需要確定競爭涉及那些段。 如果能夠在V$SESSION_WAIT捕獲waits,就可以用P1和P2的值 (對應file 和 block) 在DBA_EXTENTS中找到段名。 如何是一個表,就很可能需要重建表來創建更多的process freelists。 一種計算需要創建多少個freelist的方法是dump一些段中接近HWM的塊,檢查interested transaction list的個數,具體方法可參見3.1。interested transactions個數的峰值加1 就是需要的最小process freelists的值。

從2.3和2.4可以看出,使用多個free list可能導致更多的空塊未被使用, 也可能導致段更快地擴展。如果性能是當前所關心的重點,那么多free lists 可以用來提高并發訪問能力,當然會增加一些額外空間的耗用。然而,如果空間使用大小是首先考慮的因素,那么推薦使用single freelist,使參數FREELISTS=1, 當然就不能提升并發事務的性能了。

V$WAITSTAT 也可顯示其他類型class的競爭,包括segment header 和free list。 出現在同一個free list group中多個事務需要同時更新它們的free list header記錄時。 有多種方法來解決這個問題如重建表采用更多的free list groups,或者增加 _bump_highwater_mark_count大小,或者調整應用本身。



全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 国产一区 在线播放| 性久久久久久久久久久久久久| 性chinese极品按摩| 欧美日韩一道本| 777av视频| 男女视频在线看| 91在线第一页| av久久久久久| 中国丰满人妻videoshd| 国产97在线 | 亚洲| 国产精品人人妻人人爽人人牛| 日本福利视频在线| 交换做爰国语对白| 四虎精品欧美一区二区免费| 国产二区视频在线| 国产精品无码av无码| 香蕉视频免费版| 国产黄色特级片| 美女日批免费视频| 中文字幕55页| 色天使在线观看| 97成人在线观看视频| 精品一区二区三区无码视频| 爱情岛论坛vip永久入口| 国产婷婷一区二区三区| 日本特级黄色大片| 久久黄色片网站| 中文字幕国产传媒| 欧美一级片中文字幕| 精品国产免费av| 黑人糟蹋人妻hd中文字幕| 成人免费观看cn| 91黄色在线看| 久久视频这里有精品| 亚洲小视频在线播放| 男人日女人的bb| 黄色一级片在线看| 人妻精品无码一区二区三区| 免费黄色日本网站| 我看黄色一级片| 老司机午夜网站| 国产91在线视频观看| av片中文字幕| 路边理发店露脸熟妇泻火| 男人添女荫道口女人有什么感觉| 国产黄色激情视频| 五月婷婷深爱五月| 成年人网站国产| 国产喷水theporn| 久久久久久久9| 黄色手机在线视频| 能在线观看的av| 蜜桃福利午夜精品一区| 男操女免费网站| 黄色一级片网址| 污污网站免费观看| 国模吧无码一区二区三区| 日韩av影视大全| 一级淫片在线观看| 久久人人爽av| 日韩高清第一页| 日韩中文字幕二区| 精品中文字幕av| 99久久国产综合精品五月天喷水| 日本黄网站色大片免费观看| 中文字幕日韩综合| 中文字幕亚洲影院| 污污的视频免费| 公共露出暴露狂另类av| 色香蕉在线观看| 一女被多男玩喷潮视频| 可以免费在线看黄的网站| 热久久精品国产| 国产亚洲天堂网| 国产精品97在线| 免费成人深夜夜行网站视频| 亚欧精品在线视频| www.av91| 一区二区三区欧美精品| 国产免费内射又粗又爽密桃视频| 亚洲综合激情五月| 日韩网站在线免费观看| 午夜视频你懂的| www.xxx麻豆| 国产精品自在自线| 青青在线视频免费| av女优在线播放| 欧美激情第3页| 中文字幕第80页| 日韩av新片网| 黄色网在线视频| 中文字幕超清在线免费观看| 日韩中文字幕组| 毛葺葺老太做受视频| 狠狠噜天天噜日日噜| 最新av网址在线观看| 9999在线观看| 热久久最新地址| 91免费黄视频| 人妻夜夜添夜夜无码av| 欧美精品一区二区性色a+v| 日本黄色福利视频| 欧美精品一区二区性色a+v| 做爰高潮hd色即是空| 两性午夜免费视频| 四虎4hu永久免费入口| 妺妺窝人体色www看人体| 人人妻人人做人人爽| 无码无遮挡又大又爽又黄的视频| 妺妺窝人体色www在线小说| 国产成人亚洲精品无码h在线| 久在线观看视频| 中文字幕精品一区二区三区在线| 污版视频在线观看| 免费看黄在线看| 久久精品国产精品亚洲精品色 | 红桃视频 国产| 懂色av一区二区三区四区五区| 国产视频一视频二| 偷拍盗摄高潮叫床对白清晰| 成年人免费大片| 97超碰人人澡| 偷拍盗摄高潮叫床对白清晰| 狠狠躁狠狠躁视频专区| 免费国产a级片| 天堂8在线天堂资源bt| 9999在线观看| 亚洲少妇久久久| 亚洲视频在线a| 欧美成人一区二区在线观看| 国产一二三区在线播放| a级网站在线观看| 中文字幕第66页| 手机成人av在线| 亚洲一区二区中文字幕在线观看| 性生活免费在线观看| 国产又大又黄又粗的视频| 黄色片视频在线免费观看| 色欲av无码一区二区人妻| 色欲av无码一区二区人妻| 国产婷婷一区二区三区| 国产原创popny丨九色 | 欧洲av无码放荡人妇网站| 欧美黑人经典片免费观看| 日韩在线综合网| 欧美性大战久久久久xxx| 日韩精品一区二区三区不卡| 国产九九在线视频| 亚洲精品www.| 91麻豆天美传媒在线| 欧美人成在线观看| 免费av网址在线| 日韩精品你懂的| 在线观看污视频| 夜夜添无码一区二区三区| 中文字幕乱码人妻综合二区三区| 国产高潮免费视频| 99热这里只有精品7| 国产情侣第一页| 亚洲中文字幕无码不卡电影| 精品亚洲视频在线| 男人天堂av片| 三上悠亚在线一区| 久久国产精品网| 五月天中文字幕在线| 免费无码毛片一区二三区| 中文字幕在线综合| 国产一线二线三线女| 日韩肉感妇bbwbbwbbw| 欧美在线观看视频免费| 爆乳熟妇一区二区三区霸乳| 青春草在线视频免费观看| 国产偷人视频免费| 亚洲区成人777777精品| 中文字幕第21页| 欧美一区二区视频在线播放| 成人在线免费播放视频| 国产福利片一区二区| 国产精品视频黄色| 日本日本19xxxⅹhd乱影响| 国产又粗又猛大又黄又爽| 国产真人无码作爱视频免费| 777av视频| 99精品一级欧美片免费播放| 日韩av片网站| 免费高清在线观看免费| 91亚洲精品国产| 浴室偷拍美女洗澡456在线| 污污的网站免费| 欧美伦理片在线看| 欧美日本视频在线观看| 性一交一乱一伧国产女士spa| 亚洲第一页在线视频| 午夜一级免费视频| 激情五月俺来也| 在线免费av播放| 日本激情综合网| 日韩av片网站| 少妇一级淫免费播放| 在线观看免费视频高清游戏推荐 |