欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Oracle CBO幾種基本的查詢轉換詳解

Oracle CBO幾種基本的查詢轉換詳解

熱門標簽:騰訊地圖標注要費用嗎 高德地圖標注公司名字大全 N個你智能電銷機器人 七日殺a19.5全地圖標注 電渠外呼系統 車瑪仕極限運動場所地圖標注 廣東營銷智能外呼系統商家 地圖標注怎么保存 外呼電話系統用卡嗎

在執行計劃的開發過程中,轉換和選擇有這個不同的任務;實際上,在一個查詢進行完語法和權限檢查后,首先發生通稱為“查詢轉換”的步驟,這里會進行一系列查詢塊的轉換,然后才是“優選”(優化器為了決定最終的執行計劃而為不同的計劃計算成本從而選擇最終的執行計劃)。

我們知道查詢塊是以SELECT關鍵字區分的,查詢的書寫方式決定了查詢塊之間的關系,各個查詢塊通常都是嵌在另一個查詢塊中或者以某種方式與其相聯結;例如:

復制代碼 代碼如下:

select * from employees where department_id in (select department_id from departments)

就是嵌套的查詢塊,不過它們的目的都是去探索如果改變查詢寫法會不會提供更好的查詢計劃。

這種查詢轉換的步驟對于執行用戶可以說是完全透明的,要知道轉換器可能會在不改變查詢結果集的情況下完全改寫你的SQL語句結構,因此我們有必要重新評估自己的查詢語句的心理預期,盡管這種轉換通常來說都是好事,為了獲得更好更高效的執行計劃。

我們現在來討論一下幾種基本的轉換:

1.視圖合并
2.子查詢解嵌套
3.謂語前推
4.物化視圖查詢重寫

一、視圖合并

這種方式比較容易理解,它會將內嵌的視圖展開成一個獨立處理的查詢塊,或者將其與查詢剩余部分合并成一個總的執行計劃,轉換后的語句基本上不包含視圖了。

視圖合并通常發生在當外部查詢塊的謂語包括:

1,能夠在另一個查詢塊的索引中使用的列
2,能夠在另一個查詢塊的分區截斷中所使用的列
3,在一個聯結視圖能夠限制返回行數的條件

在這種查詢器的轉換下,視圖并不總會有自己的子查詢計劃,它會被預先分析并通常情況下與查詢的其他部分合并以獲得性能的提升,如下例。

復制代碼 代碼如下:

SQL> set autotrace traceonly explain
-- 進行視圖合并
SQL> select * from EMPLOYEES a,
  2  (select DEPARTMENT_ID from EMPLOYEES) b_view
  3  where a.DEPARTMENT_ID = b_view.DEPARTMENT_ID(+)
  4  and a.SALARY > 3000;

Execution Plan
----------------------------------------------------------
Plan hash value: 1634680537

----------------------------------------------------------------------------------------
| Id  | Operation          | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                   |  3161 |   222K|     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS OUTER|                   |  3161 |   222K|     3   (0)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| EMPLOYEES         |   103 |  7107 |     3   (0)| 00:00:01 |
|*  3 |   INDEX RANGE SCAN | EMP_DEPARTMENT_IX |    31 |    93 |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("A"."SALARY">3000)
   3 - access("A"."DEPARTMENT_ID"="DEPARTMENT_ID"(+))

-- 使用NO_MERGE防止視圖被重寫
SQL> select * from EMPLOYEES a,
  2  (select /*+ NO_MERGE */DEPARTMENT_ID from EMPLOYEES) b_view
  3  where a.DEPARTMENT_ID = b_view.DEPARTMENT_ID(+)
  4  and a.SALARY > 3000;

Execution Plan
----------------------------------------------------------
Plan hash value: 1526679670

-----------------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           |  3161 |   253K|     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN RIGHT OUTER|           |  3161 |   253K|     7  (15)| 00:00:01 |
|   2 |   VIEW                |           |   107 |  1391 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL  | EMPLOYEES |   107 |   321 |     3   (0)| 00:00:01 |
|*  4 |   TABLE ACCESS FULL   | EMPLOYEES |   103 |  7107 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"."DEPARTMENT_ID"="B_VIEW"."DEPARTMENT_ID"(+))
   4 - filter("A"."SALARY">3000)

出于某些情況,視圖合并會被禁止或限制,如果在一個查詢塊中使用了分析函數,聚合函數,,集合運算(如union,intersect,minux),order by子句,以及rownum中的任何一種,這種情況都會發生;盡管如此,我們仍然可以使用/*+ MERGE(v) */提示來強制使用視圖合并,不過前提一定要保證返回的結果集是一致的!!!如下例:

復制代碼 代碼如下:

SQL> set autotrace on
-- 使用聚合函數avg導致視圖合并失效
SQL> SELECT e1.last_name, e1.salary, v.avg_salary
  2  FROM hr.employees e1,
  3  (SELECT department_id, avg(salary) avg_salary
  4  FROM hr.employees e2
  5  GROUP BY department_id) v
  6  WHERE e1.department_id = v.department_id AND e1.salary > v.avg_salary;

Execution Plan
----------------------------------------------------------
Plan hash value: 2695105989

----------------------------------------------------------------------------------
| Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |           |    17 |   697 |     8  (25)| 00:00:01 |
|*  1 |  HASH JOIN           |           |    17 |   697 |     8  (25)| 00:00:01 |
|   2 |   VIEW               |           |    11 |   286 |     4  (25)| 00:00:01 |
|   3 |    HASH GROUP BY     |           |    11 |    77 |     4  (25)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| EMPLOYEES |   107 |   749 |     3   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL  | EMPLOYEES |   107 |  1605 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("E1"."DEPARTMENT_ID"="V"."DEPARTMENT_ID")
       filter("E1"."SALARY">"V"."AVG_SALARY")

--使用/*+ MERGE(v) */強制進行視圖合并
SQL> SELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary
  2  FROM hr.employees e1,
  3  (SELECT department_id, avg(salary) avg_salary
  4  FROM hr.employees e2
  5  GROUP BY department_id) v
  6  WHERE e1.department_id = v.department_id AND e1.salary > v.avg_salary;

Execution Plan
----------------------------------------------------------
Plan hash value: 3553954154

----------------------------------------------------------------------------------
| Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |           |   165 |  5610 |     8  (25)| 00:00:01 |
|*  1 |  FILTER              |           |       |       |            |          |
|   2 |   HASH GROUP BY      |           |   165 |  5610 |     8  (25)| 00:00:01 |
|*  3 |    HASH JOIN         |           |  3296 |   109K|     7  (15)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| EMPLOYEES |   107 |  2889 |     3   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL| EMPLOYEES |   107 |   749 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

二、子查詢解嵌套

最典型的就是子查詢轉變為表連接了,它和視圖合并的主要區別就在于它的子查詢位于where子句,由轉換器進行解嵌套的檢測。

下面便是一個子查詢==>表連接的例子:

復制代碼 代碼如下:

SQL> select employee_id, last_name, salary, department_id
  2  from hr.employees
  3  where department_id in
  4  (select department_id
  5  from hr.departments where location_id > 1700);

Execution Plan
----------------------------------------------------------
Plan hash value: 432925905

---------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                   |    34 |   884 |     4   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                 |                   |       |       |            |          |
|   2 |   NESTED LOOPS                |                   |    34 |   884 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DEPARTMENTS       |     4 |    28 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | DEPT_LOCATION_IX  |     4 |       |     1   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN           | EMP_DEPARTMENT_IX |    10 |       |     0   (0)| 00:00:01 |
|   6 |   TABLE ACCESS BY INDEX ROWID | EMPLOYEES         |    10 |   190 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("LOCATION_ID">1700)
   5 - access("DEPARTMENT_ID"="DEPARTMENT_ID")

-- 使用/*+ NO_UNNEST */強制為子查詢單獨生成執行計劃
SQL> select employee_id, last_name, salary, department_id
  2  from hr.employees
  3  where department_id in
  4  (select /*+ NO_UNNEST */department_id
  5  from hr.departments where location_id > 1700);

Execution Plan
----------------------------------------------------------
Plan hash value: 4233807898

--------------------------------------------------------------------------------------------
| Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |             |    10 |   190 |    14   (0)| 00:00:01 |
|*  1 |  FILTER                      |             |       |       |            |          |
|   2 |   TABLE ACCESS FULL          | EMPLOYEES   |   107 |  2033 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |     1 |     7 |     1   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | DEPT_ID_PK  |     1 |       |     0   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( EXISTS (SELECT /*+ NO_UNNEST */ 0 FROM "HR"."DEPARTMENTS"
              "DEPARTMENTS" WHERE "DEPARTMENT_ID"=:B1 AND "LOCATION_ID">1700))
   3 - filter("LOCATION_ID">1700)
   4 - access("DEPARTMENT_ID"=:B1)


可以看到沒有執行子查詢解嵌套的查詢只使用了FILTER來進行兩張表的匹配,謂語信息第一步的查詢也沒有絲毫的改動,這便意味著對于EMPLOYEES表中返回的107行的每一行,都需要執行一次子查詢。雖然在oracle中存在子查詢緩存的優化,我們無法判斷這兩種計劃的優劣,不過相比NESTED LOOPS,FILTER運算的劣勢是很明顯的。

如果包含相關子查詢,解嵌套過程一般會將相關子查詢轉換成一個非嵌套視圖,然后與主查詢中的表x相聯結,如:

復制代碼 代碼如下:

SQL> select outer.employee_id, outer.last_name, outer.salary, outer.department_id
  2  from hr.employees outer
  3  where outer.salary >
  4  (select avg(inner.salary)
  5  from hr.employees inner
  6  where inner.department_id = outer.department_id);

Execution Plan
----------------------------------------------------------
Plan hash value: 2167610409

----------------------------------------------------------------------------------
| Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |           |    17 |   765 |     8  (25)| 00:00:01 |
|*  1 |  HASH JOIN           |           |    17 |   765 |     8  (25)| 00:00:01 |
|   2 |   VIEW               | VW_SQ_1   |    11 |   286 |     4  (25)| 00:00:01 |
|   3 |    HASH GROUP BY     |           |    11 |    77 |     4  (25)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| EMPLOYEES |   107 |   749 |     3   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL  | EMPLOYEES |   107 |  2033 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("ITEM_1"="OUTER"."DEPARTMENT_ID")
       filter("OUTER"."SALARY">"AVG(INNER.SALARY)")

上面的查詢是將子查詢轉換成視圖在與主查詢進行hash join,轉換后的查詢其實像這樣:

復制代碼 代碼如下:

SQL> select outer.employee_id, outer.last_name, outer.salary, outer.department_id
  2  from hr.employees outer,
  3  (select department_id,avg(salary) avg_sal from hr.employees group by department_id) inner
  4  where inner.department_id = outer.department_id and outer.salary > inner.avg_sal;

其實這兩個語句的執行計劃也是一致

三、謂語前推

將謂詞從內部查詢塊推進到一個不可合并的查詢塊中,這樣可以使得謂詞條件更早的被選擇,更早的過濾掉不需要的數據行,提高效率,同樣可以使用這種方式允許某些索引的使用。

復制代碼 代碼如下:

-- 謂語前推示例
SQL> set autotrace traceonly explain
SQL> SELECT e1.last_name, e1.salary, v.avg_salary
  2  FROM hr.employees e1,
  3  (SELECT department_id, avg(salary) avg_salary
  4  FROM hr.employees e2
  5  GROUP BY department_id) v
  6  WHERE e1.department_id = v.department_id
  7  AND e1.salary > v.avg_salary
  8  AND e1.department_id = 60;

Execution Plan
----------------------------------------------------------
Plan hash value: 3521487559

-----------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                   |     1 |    41 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                   |                   |       |       |            |          |
|   2 |   NESTED LOOPS                  |                   |     1 |    41 |     3   (0)| 00:00:01 |
|   3 |    VIEW                         |                   |     1 |    26 |     2   (0)| 00:00:01 |
|   4 |     HASH GROUP BY               |                   |     1 |     7 |     2   (0)| 00:00:01 |
|   5 |      TABLE ACCESS BY INDEX ROWID| EMPLOYEES         |     5 |    35 |     2   (0)| 00:00:01 |
|*  6 |       INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |     5 |       |     1   (0)| 00:00:01 |
|*  7 |    INDEX RANGE SCAN             | EMP_DEPARTMENT_IX |     5 |       |     0   (0)| 00:00:01 |
|*  8 |   TABLE ACCESS BY INDEX ROWID   | EMPLOYEES         |     1 |    15 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   6 - access("DEPARTMENT_ID"=60)
   7 - access("E1"."DEPARTMENT_ID"=60)
   8 - filter("E1"."SALARY">"V"."AVG_SALARY")

-- 不進行謂語前推
SQL> SELECT e1.last_name, e1.salary, v.avg_salary
  2  FROM hr.employees e1,
  3  (SELECT department_id, avg(salary) avg_salary
  4  FROM hr.employees e2
  5  WHERE rownum > 1 -- rownum等于同時使用了no_merge和no_push_pred提示,這會同時禁用視圖合并和謂語前推
  6  GROUP BY department_id) v
  7  WHERE e1.department_id = v.department_id
  8  AND e1.salary > v.avg_salary
  9  AND e1.department_id = 60;

Execution Plan
----------------------------------------------------------
Plan hash value: 3834222907

--------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                   |     3 |   123 |     7  (29)| 00:00:01 |
|*  1 |  HASH JOIN                   |                   |     3 |   123 |     7  (29)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES         |     5 |    75 |     2   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |     5 |       |     1   (0)| 00:00:01 |
|*  4 |   VIEW                       |                   |    11 |   286 |     4  (25)| 00:00:01 |
|   5 |    HASH GROUP BY             |                   |    11 |    77 |     4  (25)| 00:00:01 |
|   6 |     COUNT                    |                   |       |       |            |          |
|*  7 |      FILTER                  |                   |       |       |            |          |
|   8 |       TABLE ACCESS FULL      | EMPLOYEES         |   107 |   749 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("E1"."DEPARTMENT_ID"="V"."DEPARTMENT_ID")
       filter("E1"."SALARY">"V"."AVG_SALARY")
   3 - access("E1"."DEPARTMENT_ID"=60)
   4 - filter("V"."DEPARTMENT_ID"=60)
   7 - filter(ROWNUM>1)

比較上面的兩個查詢可以看到,在第一個查詢中,DEPARTMENT_ID=60謂詞被推進到視圖v中執行了,這樣就使得內部視圖查詢只需要獲得部門號為60的平均薪水就可以了;而在第二個查詢中則需要計算每個部門的平均薪水,然后在與外部查詢聯結的時候使用DEPARTMENT_ID=60條件過濾,相對而言這里為了等待應用謂詞條件,查詢做了更多的工作。

四、使用物化視圖進行查詢重寫

當為物化視圖開啟查詢重寫功能時,CBO優化器會評估相應查詢對基表與物化視圖的訪問成本,如果優化器認為該查詢結果從物化視圖中獲得會更高效,那么就會其自動選擇為物化視圖來執行,否則則對基表生成查詢計劃。

還是來看栗子:

復制代碼 代碼如下:

SQL> set autotrace traceonly explain
SQL> select DEPARTMENT_ID,count(EMPLOYEE_ID) from EMPLOYEES group by DEPARTMENT_ID;

Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904

--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |    11 |    33 |     4  (25)| 00:00:01 |
|   1 |  HASH GROUP BY     |           |    11 |    33 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMPLOYEES |   107 |   321 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------

-- 創建物化視圖日志
SQL> create materialized view log on EMPLOYEES with sequence,
  2  rowid (EMPLOYEE_ID,DEPARTMENT_ID) including new values;

Materialized view log created.

-- 創建物化視圖,并指定查詢重寫功能
SQL> create materialized view mv_t
  2  build immediate refresh fast on commit
  3  enable query rewrite as
  4  select DEPARTMENT_ID,count(EMPLOYEE_ID) from EMPLOYEES group by DEPARTMENT_ID;

Materialized view created.

SQL> select DEPARTMENT_ID,count(EMPLOYEE_ID) from EMPLOYEES group by DEPARTMENT_ID;

Execution Plan
----------------------------------------------------------
Plan hash value: 1712400360

-------------------------------------------------------------------------------------
| Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |      |    12 |   312 |     3   (0)| 00:00:01 |
|   1 |  MAT_VIEW REWRITE ACCESS FULL| MV_T |    12 |   312 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)

可以看到在第二個查詢中,雖然是指定的查詢EMPLOYEES表,但是優化器自動選擇了物化視圖的執行路徑,因為它判斷出物化視圖已經記載當前查詢需要的結果集數據了,直接訪問物化視圖會獲得更高的效率。

值得注意的是,這里的物化視圖查詢重寫是自動發生的,同樣也可以使用/*+ rewrite(mv_t) */提示的方式強制發生查詢重寫。

總結:

盡管優化器在用戶透明的情況下改寫了我們的查詢結構,不過通常情況下這都是基于CBO優化模式下其判斷較為高效的選擇,這也是我們所期望的,同時為我們提供了一種學習方法,即在寫SQL語句的過程中時刻考慮優化器的作用。

您可能感興趣的文章:
  • oracle分區表之hash分區表的使用及擴展
  • Oracle 12CR2查詢轉換教程之表擴展詳解

標簽:來賓 玉樹 大興安嶺 贛州 遼寧 長沙 蘇州 棗莊

巨人網絡通訊聲明:本文標題《Oracle CBO幾種基本的查詢轉換詳解》,本文關鍵詞  Oracle,CBO,幾種,基本,的,查詢,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle CBO幾種基本的查詢轉換詳解》相關的同類信息!
  • 本頁收集關于Oracle CBO幾種基本的查詢轉換詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    美国黄色一级视频| 91麻豆精品国产自产在线| 精品99999| 日本在线观看不卡视频| 911亚洲精选| 精品视频一区 二区 三区| 成人欧美一区二区三区小说| 国产不卡高清在线观看视频| 又色又爽的视频| 国产色91在线| 九色综合国产一区二区三区| a天堂中文字幕| 久久欧美一区二区| 韩国一区二区视频| 一级片久久久久| 欧美激情一区二区三区四区| 国产精品一区二区在线播放| 久久人妻无码aⅴ毛片a片app| 国产三区在线成人av| 国产精品12区| 色综合一个色综合| 亚洲自拍偷拍综合| www.17c.com喷水少妇| 91精品国产综合久久久久久久| 午夜成人免费电影| 亚洲一区二区三区无码久久| 91精品国产aⅴ一区二区| 日本欧美一区二区在线观看| 91精品人妻一区二区| 久久综合一区二区| 国产成人自拍高清视频在线免费播放| 亚洲 欧美 变态 另类 综合| 1024亚洲合集| av天堂一区二区| 精品欧美乱码久久久久久1区2区| 激情五月婷婷综合网| 亚洲 欧美 国产 另类| 综合电影一区二区三区| 又色又爽又黄18网站| 日韩一级视频免费观看在线| 国产一区日韩二区欧美三区| 欧美一区二区三区爽爽爽| 亚洲综合色自拍一区| 手机在线成人av| 久久人人97超碰com| 成人app网站| 88在线观看91蜜桃国自产| 另类小说色综合网站| 九九热视频在线免费观看| 亚洲欧美激情插| 久久久久国产精品无码免费看| 2024国产精品| 91色porny在线视频| 日韩视频在线观看一区二区| 国产精品一区专区| 欧美写真视频网站| 久久99国产精品尤物| 日本韩国一区二区| 日韩不卡一区二区三区| 三上悠亚在线观看视频| 亚洲综合色网站| 国产极品视频在线观看| 一区二区三区免费观看| 法国伦理少妇愉情| 亚洲婷婷在线视频| 欧美黑人欧美精品刺激| 国产精品剧情在线亚洲| 国产黄色三级网站| ...xxx性欧美| 免费看黄色的视频| 一区二区高清在线| 国产三级在线观看完整版| 亚洲一区二区三区四区在线| 人妻无码一区二区三区免费| 亚洲动漫第一页| 国产一区二区三区在线视频观看| 婷婷综合另类小说色区| 久久免费看少妇高潮v片特黄| 日韩精彩视频在线观看| 男女羞羞免费视频| 精品夜夜嗨av一区二区三区| 欧美日韩国产另类一区| 国产精品456露脸| 日韩精品中文字幕一区 | 亚洲免费观看高清完整版在线 | 波多野结衣中文字幕在线播放| 精品久久久久一区| 国产精品91av| 国产精品毛片无遮挡高清| 久久久久亚洲av无码专区桃色| 一区二区在线观看免费| 国产又粗又长又黄的视频| 免费一区二区视频| 欧美日韩精品欧美日韩精品一 | 国产日产亚洲精品系列| 老司机午夜免费福利| 国产精品久久久久aaaa樱花| 一区二区黄色片| 性久久久久久久久久久久| 岛国毛片在线观看| 国产一区二区三区四| 日韩一区二区电影网| 国产免费无码一区二区| **网站欧美大片在线观看| 亚洲女人毛茸茸高潮| 蜜桃在线一区二区三区| 欧美日本在线一区| 女教师高潮黄又色视频| 综合av第一页| 日韩成人毛片视频| 国产成人免费在线视频| 国产亚洲精品bt天堂精选| 国产肥白大熟妇bbbb视频| 日韩国产高清在线| 欧美一区二区三区免费| 中文字幕99页| 亚洲第一福利一区| 欧美体内she精视频| 91香蕉国产在线观看软件| 亚洲少妇最新在线视频| 国产天堂av在线| 粉嫩久久99精品久久久久久夜| 国产欧美一区视频| 可以免费看av的网址| 国产精品一线二线三线精华| 久久久久久久久久久久电影 | 女同毛片一区二区三区| 日韩国产一区二| 日韩写真欧美这视频| 中文成人无字幕乱码精品区| 亚洲成人av福利| 在线91免费看| 亚洲国产欧美视频| 久久国产麻豆精品| 久久久久国产一区二区三区四区| 一色道久久88加勒比一| 国产在线精品一区二区不卡了| 久久免费偷拍视频| 日本黄区免费视频观看 | 日韩免费电影一区| 爱爱免费小视频| 韩国精品一区二区| 日本一区二区三区视频视频| 小早川怜子一区二区的演员表| 粉嫩高潮美女一区二区三区| 椎名由奈av一区二区三区| 91国偷自产一区二区三区观看| 潘金莲一级淫片aaaaa| 亚洲电影激情视频网站| 欧美大度的电影原声| 日本综合在线观看| 成人一区二区视频| 亚洲激情一二三区| 欧美一三区三区四区免费在线看| 91精品人妻一区二区| 国产麻豆精品在线| 亚洲欧美日本在线| 欧美福利视频一区| www.狠狠爱| 成人激情校园春色| 亚洲一卡二卡三卡四卡 | 日韩一区二区三区免费观看| 久久精品成人av| 国产91色综合久久免费分享| 亚洲裸体在线观看| 欧美一区二区三区免费在线看| 少妇av片在线观看| 99re成人在线| 日韩黄色小视频| 欧美韩国一区二区| 欧美日韩中字一区| 四虎永久免费在线观看| 成人午夜激情视频| 首页综合国产亚洲丝袜| 久久久久国色av免费看影院| 日本道免费精品一区二区三区| av2014天堂网| 国产91高潮流白浆在线麻豆 | 黄视频网站免费看| 特黄特色免费视频| 九九视频精品免费| 一区二区在线免费观看| 日韩美一区二区三区| 国产免费无码一区二区视频| 好吊色视频一区二区三区| 国产成人av一区二区三区在线观看| 一个色在线综合| 精品国产91洋老外米糕| 色悠悠亚洲一区二区| 女人被狂躁c到高潮| 99精品视频在线观看免费| 奇米精品一区二区三区在线观看一| 中文字幕av一区二区三区高| 欧美妇女性影城| 国产免费久久久久| 香蕉视频黄色在线观看| 9l国产精品久久久久麻豆| 麻豆精品视频在线观看视频| 亚洲黄一区二区三区| 国产午夜精品一区二区|