精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

國產(chǎn)集中庫SQL能力評測 - 訪問路徑

原創(chuàng) 精選
數(shù)據(jù)庫 其他數(shù)據(jù)庫
從數(shù)據(jù)庫架構(gòu)上看,考慮到分布式與集中式的差異較大,本次將重點(diǎn)放在集中式數(shù)據(jù)庫上。從之前接觸用戶到第三方調(diào)查機(jī)構(gòu)的報(bào)告來看,數(shù)據(jù)庫的集中式架構(gòu)仍然是主流架構(gòu),占據(jù)近八成左右的市場份額。因此選擇以集中式數(shù)據(jù)庫為評測對象。

隨著國產(chǎn)數(shù)據(jù)庫應(yīng)用步入深水區(qū),用戶開始在更核心、更多元的場景使用國產(chǎn)庫。在使用過程之中,用戶非常關(guān)心的一個(gè)問題,就是國產(chǎn)數(shù)據(jù)庫的SQL支持情況怎么樣?是不是能如 Oracle 那樣,針對復(fù)雜多變的 SQL 也能生成相對優(yōu)秀的執(zhí)行計(jì)劃,進(jìn)而保證良好的執(zhí)行效率。之前也曾聽聞過用戶吐槽,國產(chǎn)數(shù)據(jù)庫的優(yōu)化器存在諸多不足。這也促使筆者考慮針對國產(chǎn)數(shù)據(jù)庫做些 SQL 能力的評測,方便用戶有著更深入的了解。這將是一個(gè)系列,筆者看個(gè)人精力會(huì)逐步完成。受限于個(gè)人能力水平及時(shí)間精力等因素,測試過程及結(jié)果僅代表個(gè)人,不能完全反映廠商產(chǎn)品能力,歡迎批評指正。

1. 評測方案說明

1)評測對象架構(gòu):集中式

從數(shù)據(jù)庫架構(gòu)上看,考慮到分布式與集中式的差異較大,本次將重點(diǎn)放在集中式數(shù)據(jù)庫上。從之前接觸用戶到第三方調(diào)查機(jī)構(gòu)的報(bào)告來看,數(shù)據(jù)庫的集中式架構(gòu)仍然是主流架構(gòu),占據(jù)近八成左右的市場份額。因此選擇以集中式數(shù)據(jù)庫為評測對象。

2)評測功能標(biāo)準(zhǔn):Oracle

長期以來,Oracle 數(shù)據(jù)庫一直是數(shù)據(jù)庫業(yè)內(nèi)的標(biāo)桿性產(chǎn)品,特別是在集中式數(shù)據(jù)庫領(lǐng)域。因此,本次測試會(huì)以O(shè)racle 的能力為標(biāo)準(zhǔn)與國內(nèi)數(shù)據(jù)庫進(jìn)行對比。此外,考慮到國內(nèi)大部分已有業(yè)務(wù)也都是基于 Oracle 去開發(fā)的,因此遷移到國產(chǎn)數(shù)據(jù)庫采用與Oracle為參照物也具有很好的參考意義。

3)評測產(chǎn)品范圍:主流+代表性

國內(nèi)數(shù)據(jù)庫廠商及產(chǎn)品非常多,選擇哪些廠商及產(chǎn)品是個(gè)很頭疼的事情。這里本著主流或有代表性的原則進(jìn)行選擇。從現(xiàn)有集中式數(shù)據(jù)庫的市場占有率方面,選擇頭部的廠商達(dá)夢、電科金倉為代表。從生態(tài)方面選擇 openGauss 生態(tài)的海量數(shù)據(jù);MySQL生態(tài)上沒有太好選擇,故使用最新社區(qū)版本;PG 生態(tài)上由之前的電科金倉來代表。自研方面,則采用的崖山數(shù)據(jù)庫,畢竟其主打也是Oracle的兼容能力。最后也選擇 Oracle 在國內(nèi)仍然大規(guī)模使用的版本作為參照對象。

4)評測環(huán)境&版本

  • 測試環(huán)境:采用Docker鏡像方式
  • 測試版本:采用官方鏡像(可能非最新)見下文
  • 測試數(shù)據(jù):自行構(gòu)造
  • 測試配置:數(shù)據(jù)庫默認(rèn)配置,未優(yōu)化

圖片圖片

2. Oracle 訪問路徑能力說明

這里主要談 Oracle 數(shù)據(jù)的表及索引的訪問路徑問題。

1)表訪問路徑

? 全表掃描

為實(shí)現(xiàn)全表掃描,Oracle讀取表中所有的行,并檢查每一行是否滿足語句的WHERE限制條件。Oracle順序地讀取分配給表的每個(gè)數(shù)據(jù)塊,直到讀到表的最高水線處。一個(gè)多塊讀操作可以使一次I/O能讀取多塊數(shù)據(jù)塊,而不是只讀取一個(gè)數(shù)據(jù)塊,這極大的減少了I/O總次數(shù),提高了系統(tǒng)的吞吐量,所以利用多塊讀的方法可以十分高效地實(shí)現(xiàn)全表掃描,而且只有在全表掃描的情況下才能使用多塊讀操作。在這種訪問模式下,每個(gè)數(shù)據(jù)塊只被讀一次。這也是最為常規(guī)的訪問路徑,下文將以此方式為主。

? ROWID掃描

行的ROWID指出了該行所在的數(shù)據(jù)文件、數(shù)據(jù)塊以及行在該塊中的位置,所以通過ROWID來存取數(shù)據(jù)可以快速定位到目標(biāo)數(shù)據(jù)上,是Oracle存取單行數(shù)據(jù)的最快方法。為了通過ROWID存取表,Oracle首先要獲取被選擇行的ROWID,或者從語句的WHERE子句中得到,或者通過表的一個(gè)或多個(gè)索引的索引掃描得到。Oracle然后以得到的ROWID為依據(jù)定位每個(gè)被選擇的行。這種存取方法不會(huì)用到多塊讀操作,一次I/O只能讀取一個(gè)數(shù)據(jù)塊。我們會(huì)經(jīng)常在執(zhí)行計(jì)劃中看到該存取方法,如通過索引查詢數(shù)據(jù)。

? 采樣掃描

將從全部數(shù)據(jù)塊中讀取指定比例的數(shù)據(jù)之后,然后再通過過濾返回滿足條件的行。在每次執(zhí)行時(shí),都會(huì)從全部的數(shù)據(jù)塊中讀取指定比例的數(shù)據(jù)塊。所以每次讀取的數(shù)據(jù)塊都是不同的,當(dāng)某個(gè)數(shù)據(jù)塊被選定為讀取對象時(shí),塊中所有行將被全部讀取。此種訪問路徑常見于統(tǒng)計(jì)信息收集等場景之中。

2)索引訪問路徑

? 索引唯一掃描

通過唯一索引查找一個(gè)數(shù)值經(jīng)常返回單個(gè)ROWID。如果存在UNIQUE或PRIMARY KEY約束(它保證了語句只存取單行)的話,Oracle經(jīng)常實(shí)現(xiàn)唯一性掃描。在大部分情況下該掃描方式主要被使用在檢索唯一ROWID的查詢中,為了進(jìn)行索引唯一掃描而必須基于主鍵來創(chuàng)建索引或者創(chuàng)建唯一索引,且在SQL語句中必須為索引列使用"="比較運(yùn)算符。否則即使基于具有唯一值的列創(chuàng)建了索引,在執(zhí)行時(shí)優(yōu)化器也不能可能選擇索引唯一掃描,而會(huì)選擇范圍掃描。

? 索引范圍掃描

索引最普遍的數(shù)據(jù)讀取方式,優(yōu)化器選擇該掃描方式的情況有兩種,即由開始值與結(jié)束值的情況和有一個(gè)以上的行但沒有結(jié)束的情況。索引范圍掃描在尋找開始位置的時(shí)候使用隨機(jī)讀取,但之后所執(zhí)行的全部都是連續(xù)掃描。如果再精確描述,即在查找分支塊時(shí)使用的是隨機(jī)讀取,在經(jīng)過分支塊查找到開始的葉塊之后所執(zhí)行的就是連續(xù)掃描。在掃描方向上,又可分為升序掃描和降序掃描。

? 索引全掃描

索引全掃描不讀取索引結(jié)構(gòu)中的每個(gè)塊,這與其名稱表面上相悖。索引全掃描處理索引的所有葉塊,但為了查找到第一個(gè)葉塊需要處理足夠多的分支塊。一旦在索引中獲得一個(gè)葉塊,則其前和后的葉塊將按順序被鏈接起來。即,葉塊不僅可以通過分支塊導(dǎo)航;而且,一旦獲得一個(gè)葉塊,也可以隨指針獲得下一個(gè)葉塊。事實(shí)上,使用這種雙向鏈表可以在索引結(jié)構(gòu)中前進(jìn)或后退。索引全掃描使用單塊IO按順序讀取索引,它從根開始,通過分支塊到達(dá)第一個(gè)葉塊。這些塊都是每次讀取一塊。當(dāng)獲取第一個(gè)葉塊時(shí),可按順序讀取每個(gè)葉塊,同樣是一次一塊。索引全掃描從索引中按順序讀取數(shù)據(jù)。因此,索引全掃描可以避免排序。

? 索引快速全掃描

索引快速全掃描將索引等同于表的一個(gè)縮小版本。它一次讀取索引多個(gè)數(shù)據(jù)塊,處理葉塊數(shù)據(jù),并忽略分支塊。它能夠比索引全掃描更快地讀取索引結(jié)構(gòu),因?yàn)樗鞘褂昧硕鄩Kio。掃描索引中的所有的數(shù)據(jù)塊,與索引全掃描很類似,但是一個(gè)顯著的區(qū)別就是它不對查詢出的數(shù)據(jù)進(jìn)行排序,即數(shù)據(jù)不是以排序順序被返回。在這種存取方法中,可以使用多塊讀功能,也可以使用并行讀入,以便獲得最大吞吐量與縮短執(zhí)行時(shí)間。索引快速全掃描每次I/O讀取的是多個(gè)數(shù)據(jù)塊,這也是該方式與索引全掃描之間的主要區(qū)別。

? 索引跳躍掃描

索引跳過掃描改進(jìn)了非前綴列的索引掃描。通常,掃描索引塊比掃描表數(shù)據(jù)塊更快。跳過掃描允許將復(fù)合索引在邏輯上拆分為更小的子索引。在跳過掃描中,查詢中未指定復(fù)合索引的初始列。換句話說,它被跳過了。邏輯子索引的數(shù)量由初始列中不同值的數(shù)量決定。如果復(fù)合索引的前導(dǎo)列中只有很少的不同值,而索引的非前導(dǎo)鍵中有很多不同值,則跳過掃描是有利的。

3)Oracle 測試示例

-- 表掃描:全表掃描
SQL> explain plan for select * from emp;
SQL> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 |   273K|    15   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  | 10000 |   273K|    15   (0)| 00:00:01 |
--------------------------------------------------------------------------

-- 索引掃描:索引唯一掃描(index unique scan)
SQL> explain plan for select * from emp where emp_id=111;
SQL> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     1 |    28 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    28 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | EMP_PK |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

-- 索引掃描:索引范圍掃描(index range scan)
SQL> explain plan for select * from emp where emp_id<100;
SQL> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |    99 |  2772 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |    99 |  2772 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | EMP_PK |    99 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

-- 索引掃描:索引快速全掃描(index fast full scan)
SQL> explain plan for select emp_name from emp;
SQL> select * from table(dbms_xplan.display);
-------------------------------------------------------------------------------------
| Id  | Operation            | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              | 10000 | 80000 |    14   (0)| 00:00:01 |
|   1 |  INDEX FAST FULL SCAN| IDX_EMP_NAME | 10000 | 80000 |    14   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

-- 索引掃描:索引全掃描(index full scan)
SQL> exec dbms_stats.set_table_stats(ownname=>'TESTUSER',tabname=>'EMP',numrows=>1000000,numblks=>5000);
SQL> select num_rows,blocks from user_tables where table_name='EMP';
  NUM_ROWS     BLOCKS
---------- ----------
   1000000       5000
//通過偽造統(tǒng)計(jì)信息,放大表掃描的成本,讓優(yōu)化器選擇使用索引全掃描

SQL> explain plan for select emp_name from emp order by 1;
SQL> select * from table(dbms_xplan.display);
---------------------------------------------------------------------------------
| Id  | Operation        | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |              |  1000K|  7812K|    46   (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | IDX_EMP_NAME |  1000K|  7812K|    46   (0)| 00:00:01 |
---------------------------------------------------------------------------------

-- 索引掃描:索引跳躍掃描(index skip scan)
SQL> create table t as select 1 id,object_name from dba_objects;
SQL> insert into t select 2 ,object_name from dba_objects;
SQL> insert into t select 3 ,object_name from dba_objects;
SQL> insert into t select 4 ,object_name from dba_objects;
SQL> create index idx_t on t(id,object_name);
SQL> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);
SQL> explain plan for select * from t where object_name='TEST';
SQL> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------
| Id  | Operation        | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT |       |     7 |   189 |     6   (0)| 00:00:01 |
|*  1 |  INDEX SKIP SCAN | IDX_T |     7 |   189 |     6   (0)| 00:00:01 |
--------------------------------------------------------------------------

3. 國產(chǎn)庫訪問路徑能力評測

下文將對國產(chǎn)數(shù)據(jù)庫(含MySQL)做測試對比。在之前先看下結(jié)論,國產(chǎn)數(shù)據(jù)庫在訪問路徑方面能力都還可以,部分?jǐn)?shù)據(jù)庫還是稍有不足,具體可參考下面及之后的測試步驟。

圖片圖片

1)MySQL

-- 表掃描:全表掃描
mysql> explain select * from emp;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 9796 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

-- 索引掃描:索引單鍵掃描
mysql> explain select * from emp where emp_id=111;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

-- 索引掃描:索引范圍掃描
mysql> explain select * from emp where emp_id<100;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |   99 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

-- 索引掃描:索引掃描
mysql> explain select emp_name from emp;
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | index | NULL          | idx_emp_name | 33      | NULL | 9796 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+

-- 索引掃描:索引跳躍掃描
mysql> create table t as select * from information_schema.tables;
mysql> insert into t select * from t;
...
mysql> insert into t select * from t;
mysql> alter table t add id int;
mysql> create index idx_tmp on t(table_type,table_name);
mysql> analyze table t;
mysql> explain select table_type,table_name from t where table_name='COLLATIONS';
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows  | filtered | Extra                                  |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+
|  1 | SIMPLE      | t     | NULL       | range | idx_tmp       | idx_tmp | 195     | NULL | 18045 |   100.00 | Using where; Using index for skip scan |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+
-- 表掃描:全表掃描
mysql> explain select * from emp;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 9796 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

-- 索引掃描:索引單鍵掃描
mysql> explain select * from emp where emp_id=111;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

-- 索引掃描:索引范圍掃描
mysql> explain select * from emp where emp_id<100;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |   99 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

-- 索引掃描:索引掃描
mysql> explain select emp_name from emp;
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | index | NULL          | idx_emp_name | 33      | NULL | 9796 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+

-- 索引掃描:索引跳躍掃描
mysql> create table t as select * from information_schema.tables;
mysql> insert into t select * from t;
...
mysql> insert into t select * from t;
mysql> alter table t add id int;
mysql> create index idx_tmp on t(table_type,table_name);
mysql> analyze table t;
mysql> explain select table_type,table_name from t where table_name='COLLATIONS';
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows  | filtered | Extra                                  |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+
|  1 | SIMPLE      | t     | NULL       | range | idx_tmp       | idx_tmp | 195     | NULL | 18045 |   100.00 | Using where; Using index for skip scan |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+----------------------------------------+

2)DM

-- 表掃描:全表掃描
SQL> explain select * from emp;
1   #NSET2: [1, 10000, 163]
2     #PRJT2: [1, 10000, 163]; exp_num(6), is_atom(FALSE)
3       #CSCN2: [1, 10000, 163]; INDEX33555484(EMP); btr_scan(1)

-- 索引掃描:索引唯一掃描
SQL> explain select * from emp where emp_id=111;
1   #NSET2: [1, 1, 163]
2     #PRJT2: [1, 1, 163]; exp_num(6), is_atom(FALSE)
3       #BLKUP2: [1, 1, 163]; INDEX33555485(EMP)
4         #SSEK2: [1, 1, 163]; scan_type(ASC), INDEX33555485(EMP), scan_range[exp_cast(111),exp_cast(111)], is_global(0)
* 沒有唯一掃描方式,DM都認(rèn)為是范圍掃描

-- 索引掃描:索引范圍掃描
SQL> explain select * from emp where emp_id<100;
1   #NSET2: [1, 99, 163]
2     #PRJT2: [1, 99, 163]; exp_num(6), is_atom(FALSE)
3       #BLKUP2: [1, 99, 163]; INDEX33555485(EMP)
4         #SSEK2: [1, 99, 163]; scan_type(ASC), INDEX33555485(EMP), scan_range(null2,exp_cast(100)), is_global(0)
* 被認(rèn)為是從NULL到指定數(shù)值的范圍掃描

-- 索引掃描:索引全掃描
SQL> explain select emp_name from emp;
1   #NSET2: [1, 10000, 60]
2     #PRJT2: [1, 10000, 60]; exp_num(2), is_atom(FALSE)
3       #SSCN: [1, 10000, 60]; IDX_EMP_NAME(EMP); btr_scan(1); is_global(0)
* 直接使用索引掃描,不用再回表查

-- 索引掃描:索引跳躍掃描(index skip scan)
SQL> create table t as select 1 id,object_name from dba_objects;
SQL> insert into t select 2 ,object_name from dba_objects;
SQL> insert into t select 3 ,object_name from dba_objects;
SQL> insert into t select 4 ,object_name from dba_objects;
SQL> create index idx_t on t(id,object_name);
SQL> CALL SP_TAB_INDEX_STAT_INIT ('TESTUSER', 'T');
SQL> explain select * from t where object_name='TEST';
1   #NSET2: [1, 109, 64]
2     #PRJT2: [1, 109, 64]; exp_num(3), is_atom(FALSE)
3       #SLCT2: [1, 109, 64]; T.OBJECT_NAME = 'TEST'
4         #SSCN: [1, 109, 64]; IDX_T(T); btr_scan(1); is_global(0)
* 直接使用索引掃描,實(shí)現(xiàn)了跳躍掃描功能
-- 表掃描:全表掃描
SQL> explain select * from emp;
1   #NSET2: [1, 10000, 163]
2     #PRJT2: [1, 10000, 163]; exp_num(6), is_atom(FALSE)
3       #CSCN2: [1, 10000, 163]; INDEX33555484(EMP); btr_scan(1)

-- 索引掃描:索引唯一掃描
SQL> explain select * from emp where emp_id=111;
1   #NSET2: [1, 1, 163]
2     #PRJT2: [1, 1, 163]; exp_num(6), is_atom(FALSE)
3       #BLKUP2: [1, 1, 163]; INDEX33555485(EMP)
4         #SSEK2: [1, 1, 163]; scan_type(ASC), INDEX33555485(EMP), scan_range[exp_cast(111),exp_cast(111)], is_global(0)
* 沒有唯一掃描方式,DM都認(rèn)為是范圍掃描

-- 索引掃描:索引范圍掃描
SQL> explain select * from emp where emp_id<100;
1   #NSET2: [1, 99, 163]
2     #PRJT2: [1, 99, 163]; exp_num(6), is_atom(FALSE)
3       #BLKUP2: [1, 99, 163]; INDEX33555485(EMP)
4         #SSEK2: [1, 99, 163]; scan_type(ASC), INDEX33555485(EMP), scan_range(null2,exp_cast(100)), is_global(0)
* 被認(rèn)為是從NULL到指定數(shù)值的范圍掃描

-- 索引掃描:索引全掃描
SQL> explain select emp_name from emp;
1   #NSET2: [1, 10000, 60]
2     #PRJT2: [1, 10000, 60]; exp_num(2), is_atom(FALSE)
3       #SSCN: [1, 10000, 60]; IDX_EMP_NAME(EMP); btr_scan(1); is_global(0)
* 直接使用索引掃描,不用再回表查

-- 索引掃描:索引跳躍掃描(index skip scan)
SQL> create table t as select 1 id,object_name from dba_objects;
SQL> insert into t select 2 ,object_name from dba_objects;
SQL> insert into t select 3 ,object_name from dba_objects;
SQL> insert into t select 4 ,object_name from dba_objects;
SQL> create index idx_t on t(id,object_name);
SQL> CALL SP_TAB_INDEX_STAT_INIT ('TESTUSER', 'T');
SQL> explain select * from t where object_name='TEST';
1   #NSET2: [1, 109, 64]
2     #PRJT2: [1, 109, 64]; exp_num(3), is_atom(FALSE)
3       #SLCT2: [1, 109, 64]; T.OBJECT_NAME = 'TEST'
4         #SSCN: [1, 109, 64]; IDX_T(T); btr_scan(1); is_global(0)
* 直接使用索引掃描,實(shí)現(xiàn)了跳躍掃描功能

3)KingBase

-- 表掃描:全表掃描
TEST=# explain select * from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..192.00 rows=10000 width=39)
* 表的順序掃描

-- 索引掃描:索引唯一掃描
TEST=# explain select * from emp where emp_id=111;
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using EMP_PK on emp  (cost=0.29..8.30 rows=1 width=39)
   Index Cond: (emp_id = '111'::numeric)
* 標(biāo)準(zhǔn)索引掃描
   
-- 索引掃描:索引范圍掃描
TEST=# explain select * from emp where emp_id<100;
                             QUERY PLAN
---------------------------------------------------------------------
 Index Scan using EMP_PK on emp  (cost=0.29..93.77 rows=99 width=39)
   Index Cond: (emp_id < '100'::numeric)
* 標(biāo)準(zhǔn)索引掃描

-- 索引掃描:索引全掃描
TEST=# explain select emp_name from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..192.00 rows=10000 width=13)
* 默認(rèn)走了全表掃描(即使增加到100萬的記錄也是如此)

TEST=# set enable_hint=on;
TEST=# explain analyze verbose select /*+IndexOnlyScan(emp idx_emp_name)*/ emp_name from emp;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_emp_name on public.emp  (cost=0.42..69579.87 rows=1000000 width=15) (actual time=0.209..151.571 rows=1000000 loops=1)
   Output: emp_name
   Heap Fetches: 1100000
 Planning Time: 0.123 ms
 Execution Time: 172.407 ms
* 嘗試強(qiáng)制走索引掃描,成本更高。

-- 索引掃描:索引跳躍掃描(index skip scan)
TEST=# create table t as select 1 id,attname, atttypid, attstattarget, attlen, attnum, attndims, attcacheoff, atttypmod from pg_attribute;
TEST=# insert into t select 2 ,attname, atttypid, attstattarget, attlen, attnum, attndims, attcacheoff, atttypmod from pg_attribute;
...
TEST=# create index idx_t on t(id,attname );
TEST=# analyze verbose t;
TEST=# explain select * from t where attname ='TEST';
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using idx_t on t  (cost=0.29..889.09 rows=11 width=92)
   Index Cond: (attname = 'TEST'::name)
* 直接使用索引掃描,實(shí)現(xiàn)了跳躍掃描功能
-- 表掃描:全表掃描
TEST=# explain select * from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..192.00 rows=10000 width=39)
* 表的順序掃描

-- 索引掃描:索引唯一掃描
TEST=# explain select * from emp where emp_id=111;
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using EMP_PK on emp  (cost=0.29..8.30 rows=1 width=39)
   Index Cond: (emp_id = '111'::numeric)
* 標(biāo)準(zhǔn)索引掃描
   
-- 索引掃描:索引范圍掃描
TEST=# explain select * from emp where emp_id<100;
                             QUERY PLAN
---------------------------------------------------------------------
 Index Scan using EMP_PK on emp  (cost=0.29..93.77 rows=99 width=39)
   Index Cond: (emp_id < '100'::numeric)
* 標(biāo)準(zhǔn)索引掃描

-- 索引掃描:索引全掃描
TEST=# explain select emp_name from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..192.00 rows=10000 width=13)
* 默認(rèn)走了全表掃描(即使增加到100萬的記錄也是如此)

TEST=# set enable_hint=on;
TEST=# explain analyze verbose select /*+IndexOnlyScan(emp idx_emp_name)*/ emp_name from emp;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_emp_name on public.emp  (cost=0.42..69579.87 rows=1000000 width=15) (actual time=0.209..151.571 rows=1000000 loops=1)
   Output: emp_name
   Heap Fetches: 1100000
 Planning Time: 0.123 ms
 Execution Time: 172.407 ms
* 嘗試強(qiáng)制走索引掃描,成本更高。

-- 索引掃描:索引跳躍掃描(index skip scan)
TEST=# create table t as select 1 id,attname, atttypid, attstattarget, attlen, attnum, attndims, attcacheoff, atttypmod from pg_attribute;
TEST=# insert into t select 2 ,attname, atttypid, attstattarget, attlen, attnum, attndims, attcacheoff, atttypmod from pg_attribute;
...
TEST=# create index idx_t on t(id,attname );
TEST=# analyze verbose t;
TEST=# explain select * from t where attname ='TEST';
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using idx_t on t  (cost=0.29..889.09 rows=11 width=92)
   Index Cond: (attname = 'TEST'::name)
* 直接使用索引掃描,實(shí)現(xiàn)了跳躍掃描功能

4)YashanDB

-- 表掃描:全表掃描
SQL> explain plan for select * from emp;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS FULL             | EMP                  | TESTUSER   |     10000|       41( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引唯一掃描(index unique scan)
SQL> explain select * from emp where emp_id=111;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS BY INDEX ROWID   | EMP                  | TESTUSER   |         1|        1( 0)|                                |
|* 2 |   INDEX UNIQUE SCAN            | EMP_PK               | TESTUSER   |         1|        1( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引范圍掃描(index range scan)
SQL> explain select * from emp where emp_id<100;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS BY INDEX ROWID   | EMP                  | TESTUSER   |       100|        1( 0)|                                |
|* 2 |   INDEX RANGE SCAN             | EMP_PK               | TESTUSER   |       100|        1( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引快速全掃描(index fast full scan)
SQL> explain select emp_name from emp;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  INDEX FAST FULL SCAN          | IDX_EMP_NAME         | TESTUSER   |     10000|       29( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引全掃描(index full scan)
exec dbms_stats.set_table_stats('TESTUSER','EMP',null,1000000,5000,34);
//通過偽造統(tǒng)計(jì)信息,放大表掃描的成本,讓優(yōu)化器選擇使用索引全掃描

SQL> explain select emp_name from emp order by 1;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  INDEX FULL SCAN               | IDX_EMP_NAME         | TESTUSER   |   1000000|       29( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引跳躍掃描(index skip scan)
SQL> create table t as select 1 id,object_name from dba_objects;
SQL> insert into t select 2 ,object_name from dba_objects;
...
SQL> create index idx_t on t(id,object_name);
SQL> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);
SQL> explain select * from t where object_name='TEST';
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|* 1 |  INDEX SKIP SCAN               | IDX_T                | TESTUSER   |         1|        3( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
-- 表掃描:全表掃描
SQL> explain plan for select * from emp;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS FULL             | EMP                  | TESTUSER   |     10000|       41( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引唯一掃描(index unique scan)
SQL> explain select * from emp where emp_id=111;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS BY INDEX ROWID   | EMP                  | TESTUSER   |         1|        1( 0)|                                |
|* 2 |   INDEX UNIQUE SCAN            | EMP_PK               | TESTUSER   |         1|        1( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引范圍掃描(index range scan)
SQL> explain select * from emp where emp_id<100;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS BY INDEX ROWID   | EMP                  | TESTUSER   |       100|        1( 0)|                                |
|* 2 |   INDEX RANGE SCAN             | EMP_PK               | TESTUSER   |       100|        1( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引快速全掃描(index fast full scan)
SQL> explain select emp_name from emp;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  INDEX FAST FULL SCAN          | IDX_EMP_NAME         | TESTUSER   |     10000|       29( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引全掃描(index full scan)
exec dbms_stats.set_table_stats('TESTUSER','EMP',null,1000000,5000,34);
//通過偽造統(tǒng)計(jì)信息,放大表掃描的成本,讓優(yōu)化器選擇使用索引全掃描

SQL> explain select emp_name from emp order by 1;
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  INDEX FULL SCAN               | IDX_EMP_NAME         | TESTUSER   |   1000000|       29( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

-- 索引掃描:索引跳躍掃描(index skip scan)
SQL> create table t as select 1 id,object_name from dba_objects;
SQL> insert into t select 2 ,object_name from dba_objects;
...
SQL> create index idx_t on t(id,object_name);
SQL> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);
SQL> explain select * from t where object_name='TEST';
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|* 1 |  INDEX SKIP SCAN               | IDX_T                | TESTUSER   |         1|        3( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

5)Vertbase

-- 表掃描:全表掃描
vastbase=> explain select * from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..218.00 rows=10000 width=44)
* 表的順序掃描

-- 索引掃描:索引唯一掃描
vastbase=> explain select * from emp where emp_id=111;
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using emp_pk on emp  (cost=0.00..8.27 rows=1 width=44)
   Index Cond: (emp_id = 111::number)
* 標(biāo)準(zhǔn)索引掃描
   
-- 索引掃描:索引范圍掃描
vastbase=> explain select * from emp where emp_id<100;
                             QUERY PLAN
--------------------------------------------------------------------
 Index Scan using emp_pk on emp  (cost=0.00..9.13 rows=50 width=44)
   Index Cond: (emp_id < 100::number)
* 標(biāo)準(zhǔn)索引掃描

-- 索引掃描:索引全掃描
vastbase=> explain select emp_name from emp;
-- 表掃描:全表掃描
vastbase=> explain select * from emp;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on emp  (cost=0.00..218.00 rows=10000 width=44)
* 表的順序掃描

-- 索引掃描:索引唯一掃描
vastbase=> explain select * from emp where emp_id=111;
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using emp_pk on emp  (cost=0.00..8.27 rows=1 width=44)
   Index Cond: (emp_id = 111::number)
* 標(biāo)準(zhǔn)索引掃描
   
-- 索引掃描:索引范圍掃描
vastbase=> explain select * from emp where emp_id<100;
                             QUERY PLAN
--------------------------------------------------------------------
 Index Scan using emp_pk on emp  (cost=0.00..9.13 rows=50 width=44)
   Index Cond: (emp_id < 100::number)
* 標(biāo)準(zhǔn)索引掃描

-- 索引掃描:索引全掃描
vastbase=> explain select emp_name from emp;


責(zé)任編輯:武曉燕 來源: 韓鋒頻道
相關(guān)推薦

2025-01-09 07:30:49

SQL能力評測

2024-12-19 07:30:34

2024-12-10 07:30:46

2024-12-26 07:33:02

2025-02-18 07:30:35

2025-04-08 07:30:40

數(shù)據(jù)庫對象索引

2025-03-27 07:30:28

2025-04-23 07:31:14

2025-03-11 07:31:04

2024-08-22 08:02:04

OracleSQL語句

2025-03-28 07:33:09

數(shù)據(jù)庫AI助手設(shè)計(jì)

2009-03-05 10:38:00

Cisco2600路由器

2025-07-10 07:33:05

2025-10-11 07:35:14

2025-09-30 07:32:06

2021-08-06 18:37:50

SQL表連接方式

2009-09-15 10:02:44

Linq to SQL

2014-12-16 10:23:59

2025-05-13 07:31:33

2024-12-04 08:44:25

OS集中式數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲91在线| 亚洲 精品 综合 精品 自拍| 婷婷激情图片久久| 日韩美女天天操| r级无码视频在线观看| 飘雪影院手机免费高清版在线观看| 丝袜美腿亚洲一区二区图片| 久久精品国产v日韩v亚洲| 老熟女高潮一区二区三区| 婷婷六月国产精品久久不卡| 亚洲三级电影网站| 欧美日本韩国在线| 精品人妻一区二区三区三区四区| 性久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产ts丝袜人妖系列视频 | 欧美变态挠脚心| 欧美女孩性生活视频| 波多野结衣综合网| 久草中文在线| 久久一留热品黄| 97在线中文字幕| 怡春院在线视频| 国产日本精品| 欧美激情二区三区| 网站永久看片免费| 欧美人妖在线| 日韩电影免费观看中文字幕| 91视频福利网| 久久天堂影院| 色婷婷精品大视频在线蜜桃视频| 91视频 - 88av| 欧美猛烈性xbxbxbxb| 国产三级三级三级精品8ⅰ区| 粉嫩精品一区二区三区在线观看| 一区二区三区黄色片| 日韩精品一二三| 91精品国产色综合| 久久午夜无码鲁丝片| 亚洲精品国产首次亮相| 中文字幕精品—区二区| 免费成人深夜夜行p站| 美女网站色精品尤物极品姐弟| 777久久久精品| 国产福利在线免费| 久久er热在这里只有精品66| 91成人在线免费观看| 黄www在线观看| cao在线视频| 亚洲成av人片在线观看| 男女爱爱视频网站| 国产剧情在线| 亚洲精品国产成人久久av盗摄| 在线一区日本视频| 91女主播在线观看| 国产精品视频观看| 一本色道久久综合亚洲精品婷婷| 最近高清中文在线字幕在线观看| 国产日产欧美一区二区视频| 欧美一区亚洲二区| 久久电影视频| 国产日本一区二区| 日韩美女一区| 粉嫩av一区| 国产精品乱码一区二区三区软件| 亚洲日本精品国产第一区| 香蕉视频在线播放| 亚洲天堂a在线| 久久亚洲国产成人精品无码区| 18在线观看的| 亚欧色一区w666天堂| 成人黄色av片| 日韩欧美另类一区二区| 精品视频1区2区| 日韩欧美中文视频| 99精品中文字幕在线不卡| 亚洲激情在线观看| 成年人网站免费在线观看| 国产午夜一区| 裸体女人亚洲精品一区| 国产亚洲精久久久久久无码77777| 亚洲经典在线看| 欧洲成人性视频| 中文字幕黄色av| 国产成人免费在线观看不卡| 另类小说综合网| 欧美黄色激情| 亚洲福利视频导航| 天美星空大象mv在线观看视频| 亚洲男男av| 精品国产91九色蝌蚪| 人妻少妇无码精品视频区| 天天色天天射综合网| 97超碰色婷婷| 国产一区二区三区视频免费观看| 成人免费看的视频| 亚洲成人一区二区三区| 国产白丝在线观看| 欧美影院午夜播放| 女性生殖扒开酷刑vk| 欧美日韩激情| 色综合视频一区中文字幕| 国产午夜麻豆影院在线观看| 国产精品1区2区3区在线观看| 免费在线成人av| 久久亚洲天堂| 欧美日韩一二三四五区| 伊人五月天婷婷| 色婷婷狠狠五月综合天色拍| 久久久久北条麻妃免费看| 91浏览器在线观看| 国内成+人亚洲+欧美+综合在线| 国产日韩精品一区观看| 在线观看av黄网站永久| 精品国产乱码久久久久酒店 | 亚洲乱码国产乱码精品精| 少妇视频一区二区| 欧美一级视频| 国产伦精品一区二区三区四区免费| 国产在线超碰| 亚洲超碰精品一区二区| 夜夜爽久久精品91| 成人亚洲一区| 日韩美女视频免费看| 亚洲精品久久久久久久久久久久久久| 中文字幕 久热精品 视频在线| 男人插女人视频在线观看| 精品国产亚洲日本| 色综合伊人色综合网| 无码人妻精品一区二区三区不卡| 成人免费高清视频在线观看| 女同性恋一区二区| 欧美综合社区国产| 在线成人激情视频| 日韩欧美国产另类| 久久精品在线观看| 日韩精品视频久久| 日本成人a网站| 国外成人在线视频| 亚洲AV无码一区二区三区少妇| 国产精品传媒视频| 日韩av在线中文| 久久蜜桃av| 国产精品视频精品视频| 成a人片在线观看www视频| 日韩欧美aaa| 亚洲熟妇一区二区三区| 国产精品美女久久久| 久久99精品久久久久久三级| 爱草tv视频在线观看992| 欧美v亚洲v综合ⅴ国产v| 青娱乐国产盛宴| 国产成人精品aa毛片| 久久福利一区二区| 51亚洲精品| 国内精品美女av在线播放| 欧美一级免费片| 婷婷中文字幕一区三区| 精品国产av色一区二区深夜久久| 亚洲黄色在线| 欧美激情国产日韩| 亚洲第一会所| 日韩亚洲在线观看| av中文字幕观看| 午夜免费久久看| 中文字幕高清视频| 麻豆传媒一区二区三区| 天天综合五月天| 91欧美极品| 欧美中在线观看| 国产精品一区在线看| 欧美日韩视频在线第一区| 国产第一页浮力| 国产一区二区三区日韩| 91免费国产精品| 色狠狠久久av综合| 国产精品视频一| 在线电影福利片| 日韩激情视频在线| 中国a一片一级一片| 综合色中文字幕| 午夜男人的天堂| 日韩福利视频网| 400部精品国偷自产在线观看| 动漫视频在线一区| 国产97在线|日韩| 污污片在线免费视频| 亚洲精品国产欧美| 亚洲性在线观看| 午夜不卡av免费| 天美传媒免费在线观看| 成人精品gif动图一区| 天堂社区在线视频| 午夜精品电影| 欧美在线一二三区| 午夜免费欧美电影| 日韩暖暖在线视频| 91小视频xxxx网站在线| 亚洲全黄一级网站| 亚洲精品久久久久久久久久久久久久 | 国产一区二区精品免费| 国产毛片精品久久| 7777kkkk成人观看| 18+视频在线观看| 国产香蕉97碰碰久久人人| 亚洲AV无码精品色毛片浪潮| 欧美亚洲综合另类| 国产情侣在线视频| 亚洲精品日产精品乱码不卡| 91网站免费入口| 成人免费看的视频| 亚洲妇熟xx妇色黄蜜桃| 久久精品观看| 黄页免费在线观看视频| 91精品观看| 午夜精品美女久久久久av福利| 久久激情av| 91久色国产| 爱情电影网av一区二区| 国产精品com| 黄视频网站在线观看| 欧美精品制服第一页| 秋霞影院午夜丰满少妇在线视频| 亚洲欧美日韩一区二区三区在线| 好男人在线视频www| 欧美一二三区在线观看| 亚洲网站免费观看| 欧美日韩在线播| 成人一二三四区| 色综合激情五月| 国产69精品久久久久久久久久| 亚洲一区二区三区中文字幕| 91制片厂在线| 国产精品丝袜在线| 亚洲精品91在线| 久久久777精品电影网影网| 青青草视频成人| 99久久综合狠狠综合久久| www.com日本| 成人久久久精品乱码一区二区三区| 91 视频免费观看| 韩国成人在线视频| 国产精欧美一区二区三区白种人| 美女免费视频一区| 亚洲精品性视频| 捆绑变态av一区二区三区| 婷婷免费在线观看| 久久精品国产免费| 三日本三级少妇三级99| 国产原创一区二区| 中文字幕一二三区| 岛国av在线一区| 高清中文字幕mv的电影| 91在线视频在线| 三上悠亚ssⅰn939无码播放| 欧美国产精品中文字幕| 日韩欧美视频免费观看| 亚洲蜜臀av乱码久久精品| 激情综合五月网| 亚洲国产精品欧美一二99| 久久免费视频6| 午夜视频在线观看一区| 在线观看日本视频| 欧美三级一区二区| 国产精品探花视频| 精品久久一区二区三区| 神马精品久久| 国产亚洲欧美另类中文| 在线国产91| 欧美乱大交xxxxx另类电影| 国内老司机av在线| 日韩免费不卡av| 2020国产精品小视频| 91精品国产高清久久久久久91裸体| 成人在线视频中文字幕| 欧美连裤袜在线视频| 爽成人777777婷婷| 国产精品久久久久9999爆乳| 性欧美长视频| 亚洲美女爱爱视频| caoporm超碰国产精品| 88久久精品无码一区二区毛片| 国产精品成人免费| 久久久久99精品| 欧美视频精品在线观看| 午夜美女福利视频| 亚洲日韩欧美视频| 色av手机在线| 国产成人一区二区三区小说| 日韩欧美中文在线观看| 欧美成熟毛茸茸复古| 亚洲激情中文| 欧美性大战久久久久xxx| 国产乱码一区二区三区| 少妇大叫太粗太大爽一区二区| 国产精品麻豆网站| 六月丁香在线视频| 日韩欧美国产三级电影视频| 精华区一区二区三区| 久久久久免费精品国产| 久久91超碰青草在哪里看| 久久精品午夜一区二区福利| 91av精品| 韩国日本美国免费毛片| 不卡高清视频专区| 小泽玛利亚一区二区免费| 日本高清不卡视频| 天堂网在线播放| 欧美精品日韩www.p站| 美女色狠狠久久| 久久国产精品高清| 欧美精品一区二区三区久久久竹菊| 99免费视频观看| av网站一区二区三区| 欧美激情图片小说| 欧美日韩综合一区| 欧美拍拍视频| 午夜伦理精品一区| 国产精品一级在线观看| 日韩精品在在线一区二区中文| 一区二区精品| av不卡中文字幕| 亚洲免费大片在线观看| 91亚洲国产成人精品一区| 亚洲人成网站免费播放| 松下纱荣子在线观看| 国产精品v欧美精品v日韩| 欧美a级片网站| 亚洲综合123| 亚洲三级电影网站| 一区二区三区黄| 日韩在线观看高清| 欧美videos粗暴| 亚洲不卡中文字幕| 久久黄色级2电影| 国产精品久久久久久成人| 在线看国产日韩| 国产高清一区在线观看| 国产成人综合精品在线| 欧美老女人另类| 亚洲第一中文av| 国产精品伦理一区二区| 一区二区三区www污污污网站| 日韩在线播放视频| 成人乱码手机视频| 91精品国产毛片武则天| 国内精品免费在线观看| 我家有个日本女人| 欧美电影免费提供在线观看| 欧洲性视频在线播放| y111111国产精品久久婷婷| 欧美aⅴ99久久黑人专区| zjzjzjzjzj亚洲女人| 午夜精品视频在线观看| 视频一区二区三区在线看免费看| 茄子视频成人在线| 成人激情免费视频| 欧美丝袜在线观看| 一区二区三区四区中文字幕| 亚洲精品第五页| 午夜精品一区二区三区av| 欧美人与牛zoz0性行为| 五月天视频在线观看| 一区二区三区四区在线播放| 视频一区 中文字幕| 日韩av大片免费看| 国产精品成人av| av天堂一区二区| 91成人网在线| 先锋成人av| 美脚丝袜一区二区三区在线观看| 久久久亚洲人| 一区二区三区四区五区| 精品国产免费人成在线观看| 免费成人直播| 在线成人性视频| 成人丝袜18视频在线观看| 91video| 久久精品99久久久久久久久| 成人搞黄视频| 成年人黄色片视频| 亚洲三级在线观看| 亚洲色图 校园春色| 成人福利在线视频| 国产日韩一区二区三区在线播放| 在线观看免费黄色网址| 精品捆绑美女sm三区| 国产成人福利夜色影视| www.成年人视频| 欧美国产日韩a欧美在线观看| 国产极品久久久| 国产经典一区二区| 欧美日韩调教| 国产真人真事毛片视频| 亚洲国产精品中文| 亚洲天堂网站| 日韩毛片在线免费看| 伊人一区二区三区| 在线观看的av| 久久亚洲免费|