亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

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

2024-08-29 13:48:18
字體:
來源:轉載
供稿:網友

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

中興通訊重慶研究所 游波

 

要害詞: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??臻e空間來源于兩種方式: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上空間可用?,F在數據插入到塊 24 ,現在塊24的剩余空間小于該表的PCTUSED。因此塊 24 從free list鏈表中移出。PCTFREE and PCTUSED參數的目的就是用來控制數據塊從free list的鏈表中移入/移出行為的?,F在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的位置情況。



圖2.5

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

   

    對于上述塊中字段的說明,以及相關試驗。
由于篇幅所限,本文不再列舉??蓞⒖嘉墨I7。

對非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



圖4.1.1

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

    alter table t1 deallocate unused keep 10K;

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



圖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大小,或者調整應用本身。

 

參考文獻和資料:

1.《FREELISTS and FREELIST GROUPS. SCOPE & application 》

2.《INITRANS, MAXTRANS, FREELISTS and FREELIST GROUPS, PCTFREE and PCTUSED》,Mike Ault

3.《Freelist Internals: An OverviewKnowledge》,XPert for Oracle Administration

4.《Blockdump - 8.x Data Segment Header in Oracle》

5.《AskTom dbms_space_free_space》,http://asktom.oracle.com

6.《Data Blocks and Freelists》,http://www.ixora.com.au

7.《偷窺Data block 的物理結構》,http://www.itpub.net

8.《Oracle 9i for windows nt/2000數據系統培訓教程》,清華大學出版社

上述部分文章在我的blog網站http://blog.csdn.net/youbo2004上可找到,對于研究free list,free list group和block等有很好的幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线视频| 欧美日韩中文字幕综合视频| 久久影院资源站| 日韩久久精品电影| 国产91精品久久久久久| 欧美日韩免费在线| 国模叶桐国产精品一区| 欧美性猛交xxxx乱大交极品| 性色av一区二区三区在线观看| 欧美激情videoshd| 日韩av在线精品| 色与欲影视天天看综合网| 国产精品扒开腿做| 亚洲男女自偷自拍图片另类| 欧美诱惑福利视频| 亚洲精品久久在线| 欧美老妇交乱视频| 日本成人黄色片| 国产成人精品视频在线| 欧美激情亚洲国产| 亚洲精品国产精品乱码不99按摩| 日韩免费在线观看视频| 在线观看成人黄色| 国产一区二区成人| yw.139尤物在线精品视频| 91精品视频专区| 亚洲综合中文字幕在线观看| 亚洲欧美成人一区二区在线电影| 欧美日韩国产激情| 国产成+人+综合+亚洲欧美丁香花| 98精品国产高清在线xxxx天堂| 国产成人精品视频在线| 午夜精品在线观看| 久久免费精品视频| 亚洲成人动漫在线播放| 亚洲视频一区二区三区| 日韩毛片在线观看| 91久久久久久久久久久| 欧美日韩中文字幕| 色综合五月天导航| 中文字幕精品在线视频| 亚洲人a成www在线影院| 亚洲福利在线视频| 欧美成人全部免费| 韩曰欧美视频免费观看| 亚洲欧美日韩久久久久久| 91国内揄拍国内精品对白| 亚洲欧美另类人妖| 91爱视频在线| 深夜福利日韩在线看| 精品国产精品三级精品av网址| 欧美夫妻性生活视频| 亚洲国产古装精品网站| 97国产一区二区精品久久呦| 久久人人爽人人爽爽久久| 国产精品网红福利| 国产精品91久久久久久| 日韩在线一区二区三区免费视频| 久久久久日韩精品久久久男男| 色偷偷偷亚洲综合网另类| 日本免费一区二区三区视频观看| 亚洲黄色www网站| 日韩国产高清污视频在线观看| 91人人爽人人爽人人精88v| 少妇高潮久久77777| 欧美人成在线视频| 日韩成人激情影院| 成人深夜直播免费观看| 亚洲国产欧美日韩精品| 久久av红桃一区二区小说| 欧美资源在线观看| 日韩免费av在线| 欧美日韩视频在线| 国产成人avxxxxx在线看| 日韩在线视频网站| 亚洲精品电影久久久| 国产午夜精品视频| 亚洲qvod图片区电影| 亚洲香蕉成人av网站在线观看| 中文字幕日韩欧美| 久久国产精品久久国产精品| 欧美大片在线免费观看| 亚洲精品videossex少妇| 国产精品久久在线观看| 97精品国产97久久久久久| 国自产精品手机在线观看视频| 亚洲性生活视频在线观看| 亚洲精品自拍偷拍| 亚洲xxxxx| 国产丝袜一区视频在线观看| 精品丝袜一区二区三区| 久久免费精品视频| 久久久久久香蕉网| 欧美日韩在线一区| 九九久久久久99精品| 亚洲精品成a人在线观看| 亚洲精品一区二区久| 日韩中文字幕网址| 亚洲成年人影院在线| 91人人爽人人爽人人精88v| 亚洲的天堂在线中文字幕| 欧美大片免费观看在线观看网站推荐| 国精产品一区一区三区有限在线| 久久国内精品一国内精品| 国产成人精品日本亚洲| 国产精品久久久久久久一区探花| 国产欧美一区二区三区四区| 亚洲精品电影在线观看| 久久久亚洲天堂| 国产亚洲精品久久久优势| 69**夜色精品国产69乱| 国产美女久久久| 久久久久久久999精品视频| 欧美日韩国产精品一区二区三区四区| 国产一区二区三区三区在线观看| 日本韩国在线不卡| 亚洲丝袜一区在线| 韩国19禁主播vip福利视频| 亚洲美女精品久久| 亚洲综合中文字幕68页| 欧美激情在线一区| 色偷偷噜噜噜亚洲男人| 国产精品亚洲片夜色在线| 亚洲理论在线a中文字幕| 色婷婷成人综合| 欧美在线国产精品| 亚洲综合自拍一区| 一区二区三区黄色| www国产亚洲精品久久网站| 51精品国产黑色丝袜高跟鞋| 国产精品美女无圣光视频| 久久影视免费观看| 日韩欧美国产一区二区| 中文字幕av一区二区三区谷原希美| 欧美电影在线观看高清| 91九色蝌蚪国产| 亚洲视频欧洲视频| 欧美亚洲另类在线| 欧美激情在线视频二区| 欧美成人高清视频| 欧美日韩一区二区在线播放| 欧美成人免费全部观看天天性色| 国产免费一区视频观看免费| 亚洲人成电影网| 久久国产精品免费视频| 欧美华人在线视频| 亚洲天堂av在线免费观看| 亚洲qvod图片区电影| 国模gogo一区二区大胆私拍| 最近2019年中文视频免费在线观看| 日韩暖暖在线视频| 国产亚洲精品美女久久久久| 精品久久久久久中文字幕一区奶水| 国产精品96久久久久久| 亚洲色图在线观看| 国产综合色香蕉精品| 国产精品∨欧美精品v日韩精品| 亚洲奶大毛多的老太婆| 国产精品爽爽爽| 国产精品白丝jk喷水视频一区| 欧美肥老太性生活视频| 亚洲欧美激情在线视频| 欧美国产日本在线| 啊v视频在线一区二区三区|