日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)...

發布時間:2024/7/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于作者

姚延棟,山東大學本科,中科院軟件所研究生。PostgreSQL中文社區委員,致力于Greenplum/PostgreSQL開源數據庫產品、社區和生態的發展。

一、數據庫內核揭秘

Greenplum 是最成熟的開源分布式分析型數據庫(今年6月份預計發布的 Greenplum 6 之OLTP性能大幅提升,將成為一款真正的HTAP數據庫,評測數據將于近期發布),Gartner 2019 最新評測顯示 Greenplum 在經典數據分析領域位列全球第三,在實時數據分析領域位列并列第四。兩個領域中前十名中唯一一款開源數據庫產品。這意味著如果選擇一款基于開源的產品,前十名中別無選擇,唯此一款。Gartner 報告原文。

那么 Greenplum 分布式數據庫是如何煉成?眾所周知 Greenplum 基于 PostgreSQL。PostgreSQL 是最先進的單節點數據庫,其相關內核文檔、論文資源很多。而有關如何將單節點 PostgreSQL 改造成分布式數據庫的資料相對較少。本文從6個方面介紹將單節點 PostgreSQL 數據庫發展成分布式 MPP 數據庫所涉及的主要工作。當然這些僅僅是極簡概述,做到企業級產品化耗資數億美元,百人規模的數據庫尖端人才團隊十幾年的研發投入結晶而成。

雖然不是必需,然而了解 PostgreSQL 基本內核知識對理解本文中的一些細節有幫助。Bruce Momjian 的PPT是極佳入門資料。

二、?Greenplum 集群化概述

PostgreSQL 是世界上最先進的單機開源數據庫。Greenplum 基于PostgreSQL,是世界上最先進的開源MPP數據庫 (有關Greenplum更多資訊請訪問Greenplum中文社區)。從用戶角度來看,Greenplum 是一個完備的關系數據庫管理系統(RDBMS)。從物理層面,它內含多個 PostgreSQL 實例,這些實例可以單獨訪問。為了實現多個獨立的 PostgreSQL 實例的分工和合作,呈現給用戶一個邏輯的數據庫,Greenplum 在不同層面對數據存儲、計算、通信和管理進行了分布式集群化處理。Greenplum 雖然是一個集群,然而對用戶而言,它封裝了所有分布式的細節,為用戶提供了單個邏輯數據庫。這種封裝極大的解放了開發人員和運維人員。

把單節點 PostgreSQL 轉化成集群涉及多個方面的工作,本文主要介紹數據分布、查詢計劃并行化、執行并行化、分布式事務、數據洗牌(shuffle)和管理并行化等6個方面。

Greenplum 在 PostgreSQL之上還添加了大量其他功能,例如 Append-Optimized 表、列存表、外部表、多級分區表、細粒度資源管理器、ORCA 查詢優化器、備份恢復、高可用、故障檢測和故障恢復、集群數據遷移、擴容、MADlib機器學習算法庫、容器化執行UDF、PostGIS擴展、GPText套件、監控管理、集成Kubernetes等。

下圖展示了一個 Greenplum 集群的俯瞰圖,其中一個master節點,兩個segment節點,每個segment節點上部署了4個segment實例以提高資源利用率。每個實例,不管是master實例還是segment實例都是一個物理上獨立的 PostgreSQL 數據庫。

三、分布式數據存儲

數據存儲分布化是分布式數據庫要解決的第一個問題。分布式數據存儲基本原理相對簡單,實現比較容易,很多數據庫中間件也可以做到基本的分布式數據存儲。Greenplum 在這方面不單單做到了基本的分布式數據存儲,還提供了很多更高級靈活的特性,譬如多級分區、多態存儲。Greenplum 6進一步增強了這一領域,實現了一致性哈希和復制表,并允許用戶根據應用干預數據分布方法。

如下圖所示,用戶看到的是一個邏輯數據庫,每個數據庫有系統表(例如pg_catalog下面的pg_class, pg_proc 等)和用戶表(下例中為sales表和customers表)。在物理層面,它有很多個獨立的數據庫組成。每個數據庫都有它自己的一份系統表和用戶表。master 數據庫僅僅包含元數據而不保存用戶數據。master 上仍然有用戶數據表,這些用戶數據表都是空表,沒有數據。優化器需要使用這些空表進行查詢優化和計劃生成。segment 數據庫上絕大多數系統表(除了少數表,例如統計信息相關表)和master上的系統表內容一樣,每個segment都保存用戶數據表的一部分。

在 Greenplum 中,用戶數據按照某種策略分散到不同節點的不同segment實例中。每個實例都有自己獨立的數據目錄,以磁盤文件的方式保存用戶數據。使用標準的 INSERT SQL 語句可以將數據自動按照用戶定義的策略分布到合適的節點,然而INSERT性能較低,僅適合插入少量數據。Greenplum 提供了專門的并行化數據加載工具以實現高效數據導入,詳情可以參考 gpfdist 和 gpload 的官方文檔。此外 Greenplum 還支持并行 COPY,如果數據已經保存在每個 segment 上,這是最快的數據加載方法。下圖形象的展示了用戶的 sales 表數據被分布到不同的segment實例上。

除了支持數據在不同的節點間水平分布,在單個節點上Greenplum 還支持按照不同的標準分區,且支持多級分區。Greenplum 支持的分區方法有:

范圍分區:根據某個列的時間范圍或者數值范圍對數據分區。譬如以下 SQL 將創建一個分區表,該表按天分區,從 2016-01-01 到 2017-01-01 把全部一年的數據按天分成了366個分區:

CREATE TABLE sales (id int, date date, amt decimal(10,2))DISTRIBUTED BY (id)PARTITION BY RANGE (date)( START (date '2016-01-01') INCLUSIVEEND (date '2017-01-01') EXCLUSIVE EVERY (INTERVAL '1 day') );

●?列表分區:按照某個列的數據值列表,將數據分不到不同的分區。譬如以下 SQL 根據性別創建一個分區表,該表有三個分區:一個分區存儲女士數據,一個分區存儲男士數據,對于其他值譬如NULL,則存儲在單獨 other 分區。

CREATE TABLE rank (id int, rank int, year int, gender char(1), count int ) DISTRIBUTED BY (id)PARTITION BY LIST (gender)( PARTITION girls VALUES ('F'), PARTITION boys VALUES ('M'), DEFAULT PARTITION other );

下圖展示了用戶的 sales 表首先被分布到兩個節點,然后每個節點又按照某個標準進行了分區。分區的主要目的是實現分區裁剪以通過降低數據訪問量來提高性能。分區裁剪指根據查詢條件,優化器自動把不需要訪問的分區過濾掉,以降低查詢執行時的數據掃描量。PostgreSQL 支持靜態條件分區裁剪,Greenplum 通過 ORCA 優化器實現了動態分區裁剪。動態分區裁剪可以提升十幾倍至數百倍性能。

Greenplum支持多態存儲,即單張用戶表,可以根據訪問模式的不同使用不同的存儲方式存儲不同的分區。通常不同年齡的數據具有不同的訪問模式,不同的訪問模式有不同的優化方案。多態存儲以用戶透明的方式為不同數據選擇最佳存儲方式,提供最佳性能。Greenplum 提供以下存儲方式:

●?堆表(Heap Table):堆表是 Greenplum 的默認存儲方式,也是 PostgreSQL 的存儲方式。支持高效的更新和刪除操作,訪問多列時速度快,通常用于 OLTP 型查詢。

●?Append-Optimized 表:為追加而專門優化的表存儲模式,通常用于存儲數據倉庫中的事實表。不適合頻繁的更新操作。

●?AOCO (Append-Optimized, Column Oriented) 表:AOCO 表為列表,具有較好的壓縮比,支持不同的壓縮算法,適合訪問較少的列的查詢場景。

●?外部表:外部表的數據存儲在外部(數據不被Greenplum管理),Greenplum 中只有外部表的元數據信息。Greenplum 支持很多外部數據源譬如 S3、HDFS、文件、Gemfire、各種關系數據庫等和多種數據格式譬如 Text、CSV、Avro、Parquet 等。

如下圖所示,假設前面提到的 sales 表按照月份分區,那么可以采用不同的存儲策略保存不同時間的數據,例如最近三個月的數據使用堆表(Heap)存儲,更老的數據使用列存儲,一年以前的數據使用外部表的方式存儲在 S3 或者HDFS中。

數據分布是任何 MPP 數據庫的基礎,也是 MPP 數據庫是否高效的關鍵之一。通過把海量數據分散到多個節點上,一方面大大降低了單個節點處理的數據量,另一方面也為處理并行化奠定了基礎,兩者結合起來可以極大的提高整個系統的性能。譬如在一百個節點的集群上,每個節點僅保存總數據量的百分之一,一百個節點同時并行處理,性能會是單個配置更強節點的幾十倍。如果數據分布不均勻出現數據傾斜,受短板效應制約,整個系統的性能將會和最慢的節點相同。因而數據分布是否合理對 Greenplum 整體性能影響很大。

Greenplum 6 提供了以下數據分布策略。

●?哈希分布

●?隨機分布

●?復制表(Replicated Table)

Hash 分布

哈希分布是 Greenlum 最常用的數據分布方式。根據預定義的分布鍵計算用戶數據的哈希值,然后把哈希值映射到某個 segment 上。 分布鍵可以包含多個字段。分布鍵選擇是否恰當是 Greenplum 能否發揮性能的主要因素。好的分布鍵將數據均勻分布到各個 segment 上,避免數據傾斜。

Greenplum 計算分布鍵哈希值的代碼在 cdbhash.c 中。結構體 CdbHash 是處理分布鍵哈希的主要數據結構。 計算分布鍵哈希值的邏輯為:

●?使用 makeCdbHash(int segnum) 創建一個 CdbHash 結構體

●?然后對每個 tuple 執行下面操作,計算該 tuple 對應的哈希值,并確定該tuple應該分布到哪個segment上:

○?cdbhashinit():執行初始化操作

○?cdbhash(), ?這個函數會調用 hashDatum() 針對不同類型做不同的預處理,最后 addToCdbHash() 將處理后的列值添加到哈希計算中

○?cdbhashreduce() 映射哈希值到某個 segment

CdbHash 結構體:

typedef struct CdbHash

{

????uint32 ???hash; ????????????????????????/* 哈希結果值 */

????int ?????????numsegs; ?????????????????/* segment 的個數 ?*/

????CdbHashReduce reducealg; ??/* ?用于減少桶的算法 ?*/

????uint32 ???rrindex; ?????????????????????/* 循環索引 */

} CdbHash;

主要的函數

●?makeCdbHash(int numsegs): 創建一個 CdbHash 結構體,它維護了以下信息:

○?Segment 的個數

○?Reduction 方法

■?如果segment 個數是2的冪,則使用 REDUCE_BITMASK,否則使用 REDUCE_LAZYMOD.

○?結構體內的 hash 值將會為每個 tuple 初始化,這個操作發生在 cdbhashinit() 中。

●?void cdbhashinit(CdbHash *h)

h->hash = FNV1_32_INIT; 重置hash值為初始偏移基礎量

●?void cdbhash(CdbHash *h, Datum datum, Oid type): ?添加一個屬性到 CdbHash 計算中,也就是添加計算hash時考慮的一個屬性。 這個函數會傳入函數指針: addToCdbHash。

●?void addToCdbHash(void *cdbHash, void *buf, size_t len); 實現了 datumHashFunction

h->hash = fnv1_32_buf(buf, len, h->hash); ???// 在緩沖區執行 32 位 FNV 1 哈希

通常調用路徑是: evalHashKey -> cdbhash -> hashDatum -> addToCdbHash

●?unsigned int cdbhashreduce(CdbHash *h): 映射哈希值到某個 segment,主要邏輯是取模,如下所示:

switch (h->reducealg){case REDUCE_BITMASK: result = FASTMOD(h->hash, (uint32) h->numsegs); /* fast mod (bitmask) */break;case REDUCE_LAZYMOD: result = (h->hash) % (h->numsegs); /* simple mod */break;}

對于每一個 tuple 要執行下面的flow:

●void cdbhashinit(CdbHash *h)●void cdbhash(CdbHash *h, Datum datum, Oid type)●void addToCdbHash(void *cdbHash, void *buf, size_t len)●unsigned int cdbhashreduce(CdbHash *h)

隨機分布

如果不能確定一張表的哈希分布鍵或者不存在合理的避免數據傾斜的分布鍵,則可以使用隨機分布。隨機分布會采用循環的方式將一次插入的數據存儲到不同的節點上。隨機性只在單個 SQL 中有效,不考慮跨 SQL 的情況。譬如如果每次插入一行數據到隨機分布表中,最終的數據會全部保存在第一個節點上。

test=# create table t1 (id int) DISTRIBUTED RANDOMLY;CREATE TABLEtest=# INSERT INTO t1 VALUES (1);INSERT 0 1test=# INSERT INTO t1 VALUES (2);INSERT 0 1test=# INSERT INTO t1 VALUES (3);INSERT 0 1test=# SELECT gp_segment_id, * from t1; gp_segment_id | id---------------+----1 | 11 | 21 | 3

有些工具使用隨機分布實現數據管理,譬如擴容工具 gpexpand 在增加節點后需要對數據進行重分布。在初始化的時候,gpexpand 會把所有表都標記為隨機分布,然后執行重新分布操作,這樣重分布操作不影響業務的正常運行。(Greenplum 6 重新設計了 gpexpand,不再需要修改分布策略為隨機分布)

復制表(Replicated Table)

Greenplum 6支持一種新的分布策略:復制表,即整張表在每個節點上都有一個完整的拷貝。

test=# CREATE TABLE t2 (id int) DISTRIBUTED REPLICATED;CREATE TABLEtest=# INSERT INTO t2 VALUES (1), (2), (3);INSERT 0 3test=# SELECT * FROM t2;id----123(3 rows)test=# SELECT gp_segment_id, * from t2; gp_segment_id | id---------------+----0 | 10 | 20 | 3

復制表解決了兩個問題:

●?UDF 在 segment 上不能訪問任何表。由于 MPP 的特性,任何 segment 僅僅包含部分數據,因而在 segment 執行的 UDF 不能訪問任何表,否則數據計算錯誤。

yydzero=# CREATE FUNCTION c() RETURNS bigint AS $$yydzero$# SELECT count(*) from t1 AS result;yydzero$# $$ LANGUAGE SQL;CREATE FUNCTIONyydzero=# SELECT c(); c---6(1 row)yydzero=# select c() from t2;ERROR: function cannot execute on a QE slice because it accesses relation "public.t1" (seg0 slice1 192.168.1.107:25435 pid=76589)

如果把上面的t1改成復制表,則不存在這個問題。

復制表有很多應用場景,譬如 PostGIS 的 spatial_ref_sys (PostGIS 有大量的 UDF 需要訪問這張表)和 PLR 中的 plr_modules 都可以采用復制表方式。在支持這個特性之前,Greenplum 只能通過一些小技巧來支持諸如 spatial_ref_sys 之類的表。

避免分布式查詢計劃:如果一張表的數據在各個segment上都有拷貝,那么就可以生成本地連接計劃,而避免數據在集群的不同節點間移動。如果用復制表存儲數據量比較小的表(譬如數千行),那么性能有明顯的提升。 數據量大的表不適合使用復制表模式。

四、查詢計劃并行化

PostgreSQL 生成的查詢計劃只能在單節點上執行,Greenplum 需要將查詢計劃并行化,以充分發揮集群的優勢。

Greenplum 引入 Motion 算子(操作符)實現查詢計劃的并行化。Motion 算子實現數據在不同節點間的傳輸,它為其他算子隱藏了 MPP 架構和單機的不同,使得其他大多數算子不用關心是在集群上執行還是在單機上執行。每個 Motion 算子都有發送方和接收方。此外 Greenplum 還對某些算子進行了分布式優化,譬如聚集。(本小節需要理解PostgreSQL 優化器基礎知識,可參閱 src/backend/optimizer/README)

優化實例

在介紹技術細節之前,先看幾個例子。

下面的例子中創建了2張表 t1 和 t2,它們都有兩個列 c1, c2,都是以 c1 為分布鍵。

CREATE table t1 AS SELECT g c1, g + 1 as c2 FROM generate_series(1, 10) g DISTRIBUTED BY (c1);CREATE table t2 AS SELECT g c1, g + 1 as c2 FROM generate_series(5, 15) g DISTRIBUTED BY (c1);SQL1: SELECT * from t1, t2 where t1.c1 = t2.c1; c1 | c2 | c1 | c2----+----+----+---- 5 | 6 | 5 | 6 6 | 7 | 6 | 7 7 | 8 | 7 | 8 8 | 9 | 8 | 9 9 | 10 | 9 | 10 10 | 11 | 10 | 11(6 rows)

SQL1 的查詢計劃為如下所示,因為關聯鍵是兩個表的分布鍵,所以關聯可以在本地執行,HashJoin 算子的子樹不需要數據移動,最后 GatherMotion 在 master 上做匯總即可。

QUERY PLAN------------------------------------------------------------------------------Gather Motion 3:1 (slice1; segments: 3) (cost=3.23..6.48 rows=10 width=16)-> Hash Join (cost=3.23..6.48 rows=4 width=16)Hash Cond: t2.c1 = t1.c1-> Seq Scan on t2 (cost=0.00..3.11 rows=4 width=8)-> Hash (cost=3.10..3.10 rows=4 width=8)-> Seq Scan on t1 (cost=0.00..3.10 rows=4 width=8)Optimizer: legacy query optimizer

SQL2: SELECT * from t1, t2 where t1.c1 = t2.c2; c1 | c2 | c1 | c2----+----+----+---- 9 | 10 | 8 | 910 | 11 | 9 | 10 8 | 9 | 7 | 86 | 7 | 5 | 6 7 | 8 | 6 | 7(5 rows)

SQL2 的查詢計劃如下所示,t1 表的關聯鍵c1也是其分布鍵,t2 表的關聯鍵c2不是分布鍵,所以數據需要根據 t2.c2 重分布,以便所有 t1.c1 = t2.c2 的行都在同一個 segment 上執行關聯操作。

QUERY PLAN----------------------------------------------------------------------------------------------Gather Motion 3:1 (slice2; segments: 3) (cost=3.23..6.70 rows=10 width=16)-> Hash Join (cost=3.23..6.70 rows=4 width=16)Hash Cond: t2.c2 = t1.c1-> Redistribute Motion 3:3 (slice1; segments: 3) (cost=0.00..3.33 rows=4 width=8)Hash Key: t2.c2-> Seq Scan on t2 (cost=0.00..3.11 rows=4 width=8)-> Hash (cost=3.10..3.10 rows=4 width=8)-> Seq Scan on t1 (cost=0.00..3.10 rows=4 width=8)Optimizer: legacy query optimizer

SQL3: SELECT * from t1, t2 where t1.c2 = t2.c2; c1 | c2 | c1 | c2----+----+----+---- 8 | 9 | 8 | 99 | 10 | 9 | 10 10 | 11 | 10 | 115 | 6 | 5 | 6 6 | 7 | 6 | 77 | 8 | 7 | 8(6 rows)

SQL3 的查詢計劃如下所示,t1的關聯鍵c2 不是分布鍵,t2的關聯鍵c2 也不是分布鍵,所以采用廣播Motion,使得其中一個表的數據可以廣播到所有節點上,以保證關聯的正確性。最新的 master 代碼對這個查詢生成的計劃會對兩個表選擇重分布,為何這么做可以作為一個思考題:)。

QUERY PLAN--------------------------------------------------------------------------------------------Gather Motion 3:1 (slice2; segments: 3) (cost=3.25..6.96 rows=10 width=16)-> Hash Join (cost=3.25..6.96 rows=4 width=16)Hash Cond: t1.c2 = t2.c2-> Broadcast Motion 3:3 (slice1; segments: 3) (cost=0.00..3.50 rows=10 width=8)-> Seq Scan on t1 (cost=0.00..3.10 rows=4 width=8)-> Hash (cost=3.11..3.11 rows=4 width=8)-> Seq Scan on t2 (cost=0.00..3.11 rows=4 width=8)Optimizer: legacy query optimizer

SQL4: SELECT * from t1 LEFT JOIN t2 on t1.c2 = t2.c2 ; c1 | c2 | c1 | c2----+----+----+---- 1 | 2 | |2 | 3 | | 3 | 4 | |4 | 5 | | 5 | 6 | 5 | 66 | 7 | 6 | 7 7 | 8 | 7 | 88 | 9 | 8 | 9 9 | 10 | 9 | 1010 | 11 | 10 | 11(10 rows)

SQL4 的查詢計劃如下所示,盡管關聯鍵和 SQL3 一樣,然而由于采用了 left join,所以不能使用廣播t1的方法,否則數據會有重復,因而這個查詢的計劃對兩張表都進行了重分布。根據路徑代價的不同,對于 SQL4 優化器也可能選擇廣播 t2 的方法。(如果數據量一樣,單表廣播代價要高于雙表重分布,對于雙表重分布,每個表的每個元組傳輸一次,相當于單表每個元組傳輸兩次,而廣播則需要單表的每個元組傳輸 nSegments 次。)

QUERY PLAN----------------------------------------------------------------------------------------------Gather Motion 3:1 (slice3; segments: 3) (cost=3.47..6.91 rows=10 width=16)-> Hash Left Join (cost=3.47..6.91 rows=4 width=16)Hash Cond: t1.c2 = t2.c2-> Redistribute Motion 3:3 (slice1; segments: 3) (cost=0.00..3.30 rows=4 width=8)Hash Key: t1.c2-> Seq Scan on t1 (cost=0.00..3.10 rows=4 width=8)-> Hash (cost=3.33..3.33 rows=4 width=8)-> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..3.33 ...Hash Key: t2.c2-> Seq Scan on t2 (cost=0.00..3.11 rows=4 width=8)Optimizer: legacy query optimizer

SQL5:SELECT c2, count(1) from t1 group by c2;c2 | count----+-------5 | 16 | 17 | 14 | 13 | 110 | 111 | 18 | 19 | 12 | 1(10 rows)

上面四個 SQL 顯示不同類型的 JOIN 對數據移動類型(Motion類型)的影響。SQL5 演示了 Greenplum 對聚集的優化:兩階段聚集。第一階段聚集在每個 Segment 上對本地數據執行,然后通過重分布到每個 segment 上執行第二階段聚集。最后由 Master 通過 Gather Motion 進行匯總。 Greenplum 對某些 SQL 譬如 DISTINCT GROUP BY也會采用三階段聚集。

QUERY PLAN-----------------------------------------------------------------------------------------------Gather Motion 3:1 (slice2; segments: 3) (cost=3.55..3.70 rows=10 width=12)-> HashAggregate (cost=3.55..3.70 rows=4 width=12)Group Key: t1.c2-> Redistribute Motion 3:3 (slice1; segments: 3) (cost=3.17..3.38 rows=4 width=12)Hash Key: t1.c2-> HashAggregate (cost=3.17..3.17 rows=4 width=12)Group Key: t1.c2-> Seq Scan on t1 (cost=0.00..3.10 rows=4 width=4)Optimizer: legacy query optimizer(9 rows)

Greenplum 為查詢優化引入的新數據結構和概念

前面幾個直觀的例子展示了Greenplum 對不同 SQL 生成的不同分布式查詢計劃。下面介紹其主要內部機制。

為了把單機查詢計劃變成并行計劃,Greenplum 引入了一些新的概念,分別對 PostgreSQL 的 Node、Path 和 Plan結構體進行了增強:

●?新增一種節點(Node)類型:Flow

●?新增一種路徑(Path)類型:CdbMotionPath

●?新增一個新的查詢計劃(Plan)算子:Motion(Motion 的第一個字段是 Plan, Plan 結構體的第一個字段是 NodeTag type。Flow 的第一個節點也是 NodeTag type,和 RangeVar、IntoClause、Expr、RangeTableRef 是一個級別的概念)

●?為 Path 結構體添加了 CdbPathLocus locus這個字段,以表示結果元組在這個路徑下的重分布策略

●?為 Plan 結構體增加 Flow 字段,以表示這個算子的元組流向;

Node類型:Flow

新節點類型 Flow 描述了并行計劃中元組的流向。 每個查詢計劃節點(Plan 結構體)都有一個 Flow 字段,以表示當前節點的輸出元組的流向。 ?Flow 是一個新的節點類型,但不是一個查詢計劃節點。此外 Flow 結構體還包括一些用于計劃并行化的成員字段。

Flow 有三個主要字段:

●?FlowType,表示 Flow 的類型

●?UNDEFINED: 未定義 Flow

●?SINGLETON:表示的是 GatherMotion

●?REPLICATED:表示的是廣播 Motion

●?PARTITIONED: 表示的是重分布 Motion。

●?Movement,確定當前計劃節點的輸出,該使用什么樣的 motion。主要用于把子查詢的計劃進行處理以適應分布式環境。?

●?None:不需要motion

●?FOCUS:聚焦到單個 segment,相當于 GatherMotion

●?BROADCAST: 廣播 motion

●?REPARTITION: 哈希重分布

●?EXPLICIT:定向移動元組到 segid 字段標記的 segments

●?CdbLocusType: Locus 的類型,優化器使用這個信息以選擇最合適的節點進行最合適的數據流向處理,確定合適Motion。

●?CdbLocusType_Null:不用 Locus

●?CdbLocusType_Entry: 表示 entry db (即master) 上單個backend進程,可以是 QD (Query Dispatcher),也可以是 entrydb 上的 QE(Query Executor)

●?CdbLocusType_SingleQE:任何節點上的單個 backend進程,可以是 QD或者任意 QE 進程

●?CdbLocusType_General:和任何 locus 都兼容

●?CdbLocusType_Replicated:在所有 QEs 都有副本

●?CdbLocusType_Hashed:哈希分布到所有 QEs

●?CdbLocusType_Strewn:數據分布存儲,但是分布鍵未知

Path類型:CdbMotionPath

Path 表示了一種可能的計算路徑(譬如順序掃描或者哈希關聯),更復雜的路徑會繼承 Path 結構體并記錄更多信息以用于優化。 Greenplum 為 Path 結構體新加 ?CdbPathLocus locus 這個字段,用于表示結果元組在當前路徑下的重分布和執行策略。

Greenplum 中表的分布鍵決定了元組存儲時的分布情況,影響元組在那個 segment 的磁盤上的存儲。CdbPathLocus 決定了在執行時一個元組在不同的進程間(不同segment的 QE)的重分布情況,即一個元組該被那個進程處理。元組可能來自于表,也可能來自于函數。

Greenplum 還引入了一個新的路徑: CdbMotionPath, 用以表示子路徑的結果如何從發送方進程傳送給接收方進程。

Plan 算子:Motion

如上面所述,Motion 是一種查詢計劃樹節點,它實現了數據的洗牌(Shuffle),使得其父算子可以從其子算子得到需要的數據。Motion 有三種類型:

●?MOTIONTYPE_HASH:使用哈希算法根據重分布鍵對數據進行重分布,把經過算子的每個元組發送到目標 segment,目標segment由重分布鍵的哈希值確定。

●?MOTIONTYPE_FIXED:發送元組給固定的segment集合,可以是廣播 Motion(發送給所有的 segments)或者 Gather Motion (發送給固定的某個segment)

●?MOTIONTYPE_EXPLICIT:發送元組給其 segid 字段指定的 segments,對應于顯式重分布 Motion。和 MOTIONTYPE_HASH 的區別是不需要計算哈希值。

前面提到,Greenplum 為 Plan 結構體引入了 Flow *flow 這個字段表示結果元組的流向。此外Plan結構體還引入了其他幾個與優化和執行相關的字段,譬如表示是否需要 MPP 調度的DispatchMethod dispatch 字段、是否可以直接調度的 directDispatch 字段(直接調度到某個segment,通常用于主鍵查詢)、方便MPP執行的分布式計劃的 sliceTable、用于記錄當前計劃節點的父motion 節點的 motionNode 等。

生成分布式查詢計劃

下圖展示了 Greenplum 中傳統優化器(ORCA 優化器于此不同)的優化流程,本節強調與 PostgreSQL 的單機優化器不同的部分。

standard_planner 是 PostgreSQL 缺省的優化器,它主要調用了 subquery_planner 和 set_plan_references。在 Greenplum 中,set_plan_references 之后又調用了 cdbparallelize 以對查詢樹做最后的并行化處理。

subquery_planner 如名字所示對某個子查詢進行優化,生成查詢計劃樹,它主要有兩個執行階段:

●?基本查詢特性(也稱為SPJ:Select/Projection/Join)的優化,由 query_planner() 實現

●?高級查詢特性(Non-SPJ)的優化,例如聚集等,由 grouping_planner() 實現,grouping_planner() 會調用 query_planner() 進行基本優化,然后對高級特性進行優化。

Greenplum 對單機計劃的分布式處理主要發生在兩個地方:

●?單個子查詢:Greenplum 的 subquery_planner() 返回的子查詢計劃樹已經進行了某些分布式處理,譬如為 HashJoin 添加 Motion 算子,二階段聚集等。

●?多個子查詢間:Greenplum 需要設置多個子查詢間恰當的數據流向,以使得某個子查詢的結果可以被上層查詢樹使用。這個操作是由函數 cdbparallelize 實現的。

單個子查詢的并行化

Greenplum 優化單個子查詢的流程和PostgreSQL 相似,主要區別在于:

●?關聯:根據關聯算子的左右子表的數據分布情況確定是否添加 Motion 節點、什么類型的Motion 等。

●?聚集等高級操作的優化,譬如前面提到的兩階段聚集。

下面簡要介紹下主要流程:

首先使用 build_simple_rel() 構建簡單表的信息。build_simple_rel 獲得表的基本信息,譬如表里面有多少元組,占用了多少個頁等。其中很重要的一個信息是數據分布信息:GpPolicy 描述了基本表的數據分布類型和分布鍵。

然后使用 set_base_rel_pathlists() 設置基本表的訪問路徑。set_base_rel_pathlists 根據表類型的不同,調用不同的函數:

●RTE_FUNCTION: create_functionscan_path()●RTE_RELATION: create_external_path()/create_aocs_path()/create_seqscan_path()/create_index_paths()●RTE_VALUES: create_valuesscan_path

這些函數會確定路徑節點的 locus 類型,表示數據分布處理相關的一種特性。 這個信息對于子查詢并行化非常重要,在后面把 path 轉換成 plan 的時候,被用于決定一個計劃的 FLOW 類型,而 FLOW 會決定執行器使用什么樣類型的 Gang 來執行。

如何確定 locus?

對于普通的堆表(Heap),順序掃描路徑 create_seqscan_path() 使用下面方式確定路徑的 locus 信息:

●?如果表是哈希分布,則 locus 類型為 CdbLocusType_Hashed

●?如果是隨機分布,則 locus 類型為 CdbLocusType_Strewn

●?如果是系統表,則 locus 類型為 CdbLocusType_Entry

對于函數,則 create_function_path() 使用下面方式確定路徑的 locus:

●?如果函數是 immutable 函數,則使用:CdbLocusType_General

●?如果函數是 mutable 函數,則使用:CdbLocusType_Entry

●?如果函數需要在 master 上執行,則使用: CdbLocusType_Entry

●?如果函數需要在所有 segments 上執行,則使用 CdbLocusType_Strewn

如果SQL語句中包含關聯,則使用 make_rel_from_joinlist() 為關聯樹生成訪問路徑。相應的函數有:create_nestloop_path/create_mergejoin_path/create_hashjoin_path。這個過程最重要的一點是確定是否需要添加 Motion 節點以及什么類型的 Motion 節點。 譬如前面 SQL1 關聯鍵是兩張表t1/t2 的分布鍵,因而不需要添加 Motion;而 SQL2 則需要對 t2 進行重分布,以使得對于任意t1的元組,滿足關聯條件 (t1.c1 = t2.c2) 的所有t2的元組都在同一個 segment 上。

如果 SQL 包含聚集、窗口函數等高級特性,則調用 cdb_grouping_planner() 進行優化處理,譬如將聚集轉換成兩階段聚集或者三階段聚集等。

最后一步是從所有可能的路徑中選擇最廉價的路徑,并調用 create_plan() 把最優路徑樹轉換成最優查詢樹。

在這個階段, Path 路徑的 Locus 影響生成的 Plan 計劃的 Flow 類型。Flow 和執行器一節中的 Gang 相關,Flow 使得執行器不用關心數據以什么形式分布、分布鍵是什么,而只關心數據是在多個 segment 上還是單個 segment 上。 Locus 和 Flow 之間的對應關系:

●FLOW_SINGLETON: Locus_Entry/Locus_SingleQE/Locus_General●FLOW_PARTITIONED: Locus_Hash/Locus_Strewn/Locus_Replicated

多個子查詢間的并行化

cdbparallelize() 主要目的是解決多個子查詢之間的數據流向,生成最終的并行化查詢計劃。它含有兩個主要步驟:prescan 和 apply_motion

●?prescan 有兩個目的,一個目的是對某些類型的計劃節點(譬如 Flow )做標記以備后面 apply_motion 處理;第二個目的是對子計劃節點 (SubPlan)進行標記或者變形。SubPlan 實際上不是查詢計劃節點,而是表達式節點,它包含一個計劃節點及其范圍表(Range Table)。 SubPlan 對應于查詢樹中的 SubLink(SQL 子查詢表達式),可能出現在表達式中。prescan 對 SubPlan 包含的計劃樹做以下處理:

●?如果 Subplan 是個 Initplan,則在查詢樹的根節點做一個標注,表示需要以后調用 apply_motion 添加一個 motion 節點。

●?如果 Subplan 是不相關的多行子查詢,則根據計劃節點中包含的 Flow 信息對子查詢執行 Gather 或者廣播操作。并在查詢樹之上添加一個新的 materialized (物化)節點,以防止對 Subplan 進行重新掃描。因為避免了每次重新執行子查詢,所以效率提高。

●?如果 Subplan 是相關子查詢,則轉換成可執行的形式。遞歸掃描直到遇到葉子掃描節點,然后使用下面的形式替換該掃描節點。經過這個轉換后,查詢樹可以并行執行,因為相關子查詢已經變成結果節點的一部分,和外層的查詢節點在同一個Slice中。

Result \ \_Material \ \_Broadcast (or Gather) \ \_SeqScan

●?apply_motion: 根據計劃中的 Flow 節點,為頂層查詢樹添加 motion 節點。根據 SubPlan 類型的不同(譬如InitPlan、不相關多行子查詢、相關子查詢)添加不同的Motion節點。

譬如 SELECT * FROM tbl WHERE id = 1,prescan() 遍歷到查詢樹的根節點時會在根節點上標注,apply_motion() 時在根節點之上添加一個 GatherMotion。

本篇主要介紹了Greenplum集群概述、分布式數據存儲和分布式查詢優化。下一篇將會繼續介紹分布式查詢執行、分布式事務、數據洗牌和集群管理等。

PostgreSQL中文社區歡迎廣大技術人員投稿

投稿郵箱:press@postgres.cn

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

狠狠色伊人亚洲综合成人 | 色一级片| 国产精品久久精品国产 | 在线观看中文字幕亚洲 | 91av片| 久久久久久久久久久国产精品 | 中文字幕乱码日本亚洲一区二区 | 久久精品一二三 | 精品国产理论片 | 国产激情电影综合在线看 | 色婷婷狠 | 日韩在线视频免费播放 | 亚洲国内精品 | 久久精品国亚洲 | 亚洲精品久久久久www | 91黄色视屏 | 亚洲第一av在线 | 99re在线视频观看 | www.香蕉视频在线观看 | 精品99视频 | 国产日韩在线观看一区 | 四虎5151久久欧美毛片 | 免费韩国av| 国产成人精品一区二区三区免费 | 波多野结衣电影久久 | 日本三级人妇 | 色网站黄| 久久国产精品成人免费浪潮 | 国产专区第一页 | 男女视频国产 | 久久久久国产精品一区 | 亚洲精品在线一区二区三区 | 国内外激情视频 | 粉嫩aⅴ一区二区三区 | 欧美激情精品久久久久久免费印度 | 亚洲免费在线观看视频 | 亚洲mv大片欧洲mv大片免费 | 国产原创中文在线 | 久久成人国产精品入口 | 亚洲国产精品va在线 | 天天艹天天 | 日本性生活一级片 | 国产精品手机看片 | 欧美精品九九99久久 | 国产一区二区高清视频 | 亚洲精品成人av在线 | 天天操天天摸天天射 | 午夜视频播放 | 婷婷久月 | 中文字幕亚洲高清 | 日韩在线观看中文 | 久久国产精品视频免费看 | 97人人添人澡人人爽超碰动图 | 色香天天| 国产精品一区一区三区 | 国产黄视频在线观看 | 国产乱码精品一区二区三区介绍 | 婷婷六月综合网 | 国产中文字幕免费 | 黄色软件大全网站 | 国产三级av在线 | 亚洲国产精品va在线看 | 亚洲资源视频 | 国产分类视频 | 中文字幕有码在线播放 | 午夜的福利 | 久久人人97超碰国产公开结果 | 亚洲电影图片小说 | 免费日韩 精品中文字幕视频在线 | 在线视频91 | 国产情侣一区 | 久久久精品小视频 | 91视频国产免费 | 香蕉视频色 | 娇妻呻吟一区二区三区 | 国产精品一区二区果冻传媒 | 欧美狠狠操 | 日日草av| 在线观看免费观看在线91 | 51久久夜色精品国产麻豆 | 久久久久久网址 | 天天要夜夜操 | 91在线影视| 99热高清| 91av社区 | 黄色日视频 | 五月天婷亚洲天综合网鲁鲁鲁 | 免费黄在线看 | 国产区精品视频 | 日本中文在线播放 | 欧美日韩国产网站 | 国产精品乱码久久久久久1区2区 | 精品国产a | 欧美在线一二区 | 婷婷精品国产一区二区三区日韩 | 99在线精品视频在线观看 | 青青草国产在线 | 极品久久久久久久 | 91av影视 | 成人午夜片av在线看 | av黄色在线播放 | 精品在线视频播放 | 久草精品视频在线看网站免费 | 91看片在线观看 | 成人av在线观 | 人人干人人超 | 中文字幕丝袜一区二区 | 久久网址| 国产在线精品一区二区不卡了 | 综合久久影院 | 天天操天天添天天吹 | 综合天堂av久久久久久久 | 黄色的网站免费看 | 麻豆久久久| 在线亚洲午夜片av大片 | 91精品一区国产高清在线gif | 久久视| 成人免费在线视频观看 | 夜夜爽88888免费视频4848 | 日韩在线观看中文 | 就要色综合 | 成人av片免费观看app下载 | 69av网| av一级网站| 久久成人午夜视频 | a成人v | 欧美日韩国产精品一区二区亚洲 | 69xxxx欧美 | 久久综合久久综合这里只有精品 | 婷婷四房综合激情五月 | 国产精品九九视频 | 国产精品999久久久 久产久精国产品 | 黄色三级久久 | 久爱精品在线 | 日韩a级免费视频 | 欧美一级专区免费大片 | 婷婷五月色综合 | 激情视频免费在线观看 | 精品乱码一区二区三四区 | 久久亚洲精品电影 | 精品久久久久久久久中文字幕 | 日韩三级不卡 | 亚洲婷婷在线 | 最近免费观看的电影完整版 | a资源在线 | 蜜桃视频日韩 | 美女黄频在线观看 | 日韩在线观看第一页 | www.eeuss影院av撸| 黄色大片日本免费大片 | 成人在线视频免费看 | 六月丁香婷婷在线 | 欧美在线久久 | 国产精品视频专区 | 狠狠色噜噜狠狠狠 | 成人av网站在线播放 | 欧美在线视频第一页 | 一区二区三区国产精品 | 999超碰 | 日韩一区二区三区不卡 | 精品超碰 | 成人一区二区三区中文字幕 | 极品国产91在线网站 | 国内精品二区 | 日本xxxx.com| 国产 成人 久久 | 亚洲国产一区在线观看 | 日日激情| 一区二区三区福利 | 综合婷婷丁香 | 亚洲第一中文网 | av在线看片| 国产三级香港三韩国三级 | 日本激情视频中文字幕 | 国产精品2020| 久 久久影院 | 日日夜夜91 | 欧美成人黄色 | 亚洲国产中文字幕在线 | 美女黄频在线观看 | 91麻豆文化传媒在线观看 | 久久狠狠一本精品综合网 | 三级性生活视频 | 久久99深爱久久99精品 | 91在线视频网址 | 男女日麻批 | 亚洲国产日韩在线 | 国产麻豆精品传媒av国产下载 | 免费三级在线 | 国产午夜精品一区二区三区欧美 | 日韩成人在线免费观看 | 久久精品影视 | 日日插日日干 | 久久av在线 | 五月综合网 | 免费大片av | 在线免费亚洲 | 中文区中文字幕免费看 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产一级免费电影 | 亚洲综合色网站 | 色婷婷久久一区二区 | 亚洲狠狠丁香婷婷综合久久久 | 久久精品艹 | 日韩在线高清 | 爱爱av网站 | 婷婷久久综合网 | 欧美一级视频在线观看 | 亚洲三级黄 | 久久男人免费视频 | 成人综合日日夜夜 | 亚洲在线成人精品 | 一区二区三区观看 | 亚洲高清在线视频 | 久久国内精品 | 西西www4444大胆在线 | 成人av午夜 | 久久久www成人免费毛片 | 蜜桃视频在线视频 | 亚洲欧美一区二区三区孕妇写真 | 日日夜夜狠狠干 | 亚洲 欧美 国产 va在线影院 | 国产日韩在线看 | 国产香蕉视频在线观看 | 精品一区电影国产 | 91看片看淫黄大片 | 在线看日韩 | 中文字幕第一页在线视频 | 黄a网站 | 欧美精品久久久久久 | 国产精品免费久久久久久 | 亚洲精品tv久久久久久久久久 | 特级a老妇做爰全过程 | 狠狠色丁香婷婷综合久久片 | 免费国产在线精品 | 国产不卡免费av | 日韩免费视频 | 久久久精品网站 | 国产手机在线视频 | 国产免费a | 黄色特级毛片 | 日本黄色大片免费看 | 深爱激情站 | 国产xvideos免费视频播放 | 成人av在线影院 | 欧美日韩网站 | 欧美一区二区三区在线观看 | 一本一道久久a久久精品 | 精品在线一区二区三区 | 91av在线免费看 | 亚洲码国产日韩欧美高潮在线播放 | 成人午夜电影网站 | 日韩在线视频线视频免费网站 | 97人人人人| 国产在线欧美 | 日韩免费不卡视频 | 91精品在线麻豆 | 色综合久久88色综合天天6 | 午夜久久影院 | 亚洲成av片人久久久 | 国产又粗又猛又黄 | 免费观看十分钟 | 五月天综合| 亚洲电影久久久 | 日韩视频一区二区三区在线播放免费观看 | 97免费公开视频 | 另类老妇性bbwbbw高清 | 欧美日韩在线观看一区二区 | 成人免费网视频 | 久久精品电影 | 成人免费观看完整版电影 | 色欧美成人精品a∨在线观看 | 99久久这里只有精品 | 久久精品9 | 91精品一区二区三区蜜臀 | 成人av教育 | av在线电影免费观看 | 黄色一级动作片 | 欧美男女爱爱视频 | 国产999精品久久久久久麻豆 | 91黄色在线看 | 亚州黄色一级 | 色网址99| 国内精品亚洲 | 日韩免费不卡av | 国产va精品免费观看 | 成人精品一区二区三区中文字幕 | 国产999精品久久久久久 | 99热99| 91尤物国产尤物福利在线播放 | 特级毛片在线免费观看 | 免费看污在线观看 | 五月天六月婷 | 夜夜爽www| 久久久精品小视频 | 国产乱视频| 一级片观看 | 麻豆一区二区 | 欧美夫妻性生活电影 | 日韩欧美高清 | 啪啪动态视频 | 天堂中文在线播放 | 麻豆影视在线播放 | 久久有精品 | 久久伊人爱| 在线免费观看视频一区 | 波多野结衣一区二区三区中文字幕 | 日韩在线观看视频一区二区三区 | 中文字幕在线播放av | 国产日韩精品久久 | 亚洲激情六月 | 成人欧美一区二区三区在线观看 | av丝袜美腿 | 色婷婷婷| 在线久热 | 视频成人永久免费视频 | 在线看片中文字幕 | 成人在线视| 欧美黄在线 | 一区二区三区在线不卡 | 精品资源在线 | 夜夜爽88888免费视频4848 | 8090yy亚洲精品久久 | 91精品国产麻豆 | 99精品欧美一区二区三区 | 九九视频精品免费 | 久久99电影 | 亚洲性少妇性猛交wwww乱大交 | 国产精品18久久久久久久网站 | 在线观看黄 | 超碰在线cao | 爱av在线网 | 中文字幕亚洲在线观看 | 性色av香蕉一区二区 | 五月天狠狠操 | 中字幕视频在线永久在线观看免费 | 九色精品 | 国产精品igao视频网入口 | 99视频99| 四虎永久网站 | 亚洲欧美成人在线 | 少妇搡bbbb搡bbb搡aa | 日韩在线免费观看视频 | 99免费观看视频 | 99在线精品视频 | 一区二区精品在线 | 激情欧美一区二区三区 | 成片人卡1卡2卡3手机免费看 | 97超碰人人澡人人爱 | 五月综合激情婷婷 | 亚洲精品久久在线 | 日韩电影中文 | 2023av在线 | 日本资源中文字幕在线 | 亚洲综合在线一区二区三区 | 亚洲国产婷婷 | 97成人在线观看视频 | 99免费看片| 永久中文字幕 | 91成人免费在线 | 国产精品日韩在线观看 | 精品视频| 麻豆网站免费观看 | 天天骚夜夜操 | 又黄又爽又刺激视频 | 天天躁天天躁天天躁婷 | 天天拍天天操 | 亚州精品一二三区 | 国产欧美最新羞羞视频在线观看 | 久久久亚洲网站 | 日韩中文字幕免费看 | 久久69精品 | 综合国产在线观看 | 九九九国产 | 美女视频黄是免费的 | 免费久久久久久 | www天天干com| 91伊人| 日本精品视频免费 | 四虎影视欧美 | 久草在线电影网 | 天堂av在线7 | 国产精品12| 久久免费精品一区二区三区 | 99一级片 | 亚洲在线观看av | 综合激情婷婷 | 午夜美女wwww | 一级a性色生活片久久毛片波多野 | 18岁免费看片 | www.五月天色 | 色丁香综合 | 中文字幕亚洲字幕 | 亚洲精品2区 | 激情中文字幕 | 超碰国产在线观看 | 日韩中文三级 | 国产精品久久久久久99 | 一区二区三区国 | 久草在线视频新 | 91九色在线视频观看 | va视频在线| 91免费视频黄 | 九九免费在线视频 | 久久在线免费观看 | 久久久久伦理电影 | 中文字幕在线第一页 | 成人免费观看完整版电影 | av在线最新 | 亚洲狠狠丁香婷婷综合久久久 | 亚洲综合欧美激情 | 99国产在线 | 日日夜夜国产 | 97视频免费观看2区 亚洲视屏 | 99re8这里有精品热视频免费 | 日本视频精品 | 热久久在线视频 | 精品国产一区二区三区久久影院 | 天天躁日日躁狠狠 | 久99久视频 | 久久不卡免费视频 | 在线一区二区三区 | 日韩电影中文字幕在线 | 久久精品一区二区三区中文字幕 | 麻豆 free xxxx movies hd | 欧美日本中文字幕 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 色噜噜噜 | 中文字幕在线视频第一页 | 日日碰狠狠添天天爽超碰97久久 | 久久久99国产精品免费 | 久久国产午夜精品理论片最新版本 | 欧美日韩免费观看一区=区三区 | 国产美女精品在线 | 91热在线 | 日本狠狠干 | 2021国产精品 | 麻豆传媒视频在线播放 | 视频国产一区二区三区 | a亚洲视频| 丁香婷婷亚洲 | 看国产黄色大片 | 欧美日韩精品在线免费观看 | 亚洲综合色激情五月 | 久久av不卡 | 亚洲精品裸体 | 日韩欧美一区二区三区在线观看 | av在线h| 91免费国产在线观看 | 中文字幕在线观看免费 | 嫩草伊人久久精品少妇av | 国精产品满18岁在线 | 久久99久久99久久 | 97精品电影院| 亚洲在线高清 | 免费在线激情电影 | 在线观看一级视频 | 四虎永久网站 | 99九九99九九九视频精品 | 超碰97成人 | 免费又黄又爽的视频 | 国产1区在线观看 | av五月婷婷 | 天天爱av导航 | 96av在线视频 | 欧美日韩国产成人 | 国产精品久久久久久一区二区 | 五月情婷婷 | 久久久www成人免费毛片麻豆 | 免费黄a | 国产精品成人免费 | 天天插狠狠干 | 成人午夜黄色 | 韩国av免费观看 | 狠狠干综合网 | 在线日韩 | 人人爽人人爽人人爽学生一级 | 午夜影院先| 亚洲年轻女教师毛茸茸 | 成人9ⅰ免费影视网站 | 欧洲精品久久久久毛片完整版 | 日日噜噜噜噜夜夜爽亚洲精品 | 精品国产伦一区二区三区观看说明 | 人人爽人人爽人人爽人人爽 | zzijzzij亚洲成熟少妇 | av不卡免费看 | 国产在线精品国自产拍影院 | 久久女同性恋中文字幕 | 国产成人精品在线观看 | www.av小说 | 日韩免费在线网站 | 91精品久久久久久粉嫩 | 久久精品国产精品亚洲 | 欧美日韩亚洲在线观看 | 久久久久北条麻妃免费看 | av综合在线观看 | 亚洲一二三久久 | 欧美精品日韩 | 久久免费视频2 | 国产精品尤物视频 | 久久久久欧美精品999 | 欧美色图亚洲图片 | 欧美视频在线观看免费网址 | 国产伦精品一区二区三区四区视频 | 亚洲综合一区二区精品导航 | 91av资源网| 成人在线网站观看 | 麻豆果冻剧传媒在线播放 | 久久99精品久久久久久秒播蜜臀 | 色吊丝在线永久观看最新版本 | 一级成人免费视频 | 99久久日韩精品免费热麻豆美女 | 亚洲黄色免费观看 | 日韩性片| 一级大片在线观看 | 国内精品久久久精品电影院 | 久久av伊人 | 精品国产精品国产偷麻豆 | 五月天中文在线 | 成人av动漫在线 | 超碰成人av | 精品 一区 在线 | 夜夜爽www| 亚洲精品国产精品国自产 | 欧美一区二区精美视频 | 久久九九国产视频 | 国产精品久久久久久久久久东京 | 在线视频日韩精品 | 色婷婷国产精品一区在线观看 | 久草免费手机视频 | 免费中文字幕在线观看 | 国产成人精品综合久久久 | 91看国产| 成人在线视频网 | 婷婷精品国产一区二区三区日韩 | 久久综合九色综合欧美就去吻 | 欧美一进一出抽搐大尺度视频 | 日韩精品久久一区二区 | 久久99国产精品二区护士 | 国产成人久久精品77777综合 | 日本精品久久久久久 | av先锋中文字幕 | 国产精品久久久久久久久久久久久久 | 国产精品99在线播放 | 91完整版 | 在线免费观看视频 | 中文字幕乱码电影 | 国产在线色 | 丁香花五月 | 日韩视频图片 | 国产区精品在线观看 | 丝袜美腿亚洲综合 | 天天射综合网视频 | 国产三级精品三级在线观看 | 午夜国产影院 | 一区二区三区高清在线 | 久久视频在线 | 丁香六月色 | 国产精品美女久久久 | 我要看黄色一级片 | 亚洲午夜精品福利 | 2022国产精品视频 | 国产精品系列在线播放 | 亚洲涩涩涩涩涩涩 | 国产日韩精品一区二区三区 | 日日干天夜夜 | a√天堂中文在线 | 国产一级h | 免费男女羞羞的视频网站中文字幕 | 欧美午夜a | 天天射天天拍 | 中文欧美字幕免费 | 亚洲精品午夜国产va久久成人 | 九九日九九操 | 久久久久 免费视频 | 伊人影院99| 九九综合九九 | 日韩美女av在线 | 中文字幕在线观看91 | 国产免费亚洲高清 | 麻豆国产在线视频 | 成人av影视观看 | 1024手机在线看 | 精品久久国产 | 免费久久网 | 亚洲免费观看视频 | 欧美巨乳波霸 | 丁香婷婷在线 | 91精品在线视频观看 | 欧洲亚洲女同hd | 亚洲老妇xxxxxx | 亚洲影音先锋 | 婷婷丁香av | 久久综合九色99 | 国产精品久久久久久av | 激情视频在线高清看 | 天堂av在线中文在线 | 国产精品第二十页 | 亚洲男男gaygay无套同网址 | 精品视频中文字幕 | 国产亚洲精品久久久久久久久久 | 国产麻豆电影 | 综合色爱| 日韩欧美高清一区二区 | 国产一区二三区好的 | a成人v在线| 91探花在线| 99久久久精品 | 久久国内精品视频 | 国产精品久久久久久久久搜平片 | 一本—道久久a久久精品蜜桃 | 久久亚洲热 | 国产在线观看h | 成人在线免费视频观看 | 天天干天天插 | 日韩一区二区三区免费视频 | 亚洲精品国偷自产在线91正片 | 色综合久久精品 | 欧美 亚洲 另类 激情 另类 | 五月婷婷婷婷婷 | 91精品国自产在线观看欧美 | 在线电影 你懂得 | 狠狠色伊人亚洲综合网站色 | 日韩色区| av在线播放网址 | 日韩一级黄色av | 中文字幕在线观 | 久草视频免费 | 91福利国产在线观看 | 91福利影院在线观看 | 美女精品国产 | 亚洲九九九| 91最新在线视频 | 精品国产a | 成年人视频在线 | 久久精品男人的天堂 | 黄色网址中文字幕 | 国产精品久久久久久久久久久久 | 九九精品无码 | 久久精品毛片基地 | 尤物九九久久国产精品的分类 | 91| 黄色三级免费片 | 日本aa在线 | 国产亚洲综合性久久久影院 | 婷婷5月色 | 国内丰满少妇猛烈精品播 | 日韩久久精品一区二区三区下载 | 在线 高清 中文字幕 | 手机av观看 | 婷婷激情影院 | 91免费观看视频在线 | 视频高清 | 久久免费视频5 | 午夜丁香网 | 天天操天天色综合 | 毛片永久新网址首页 | 亚洲精品在线观看的 | 成人h视频 | 国精产品999国精产品视频 | 国产区免费 | 超碰人人在 | 91热| 久精品视频在线观看 | 国产精品久久久久久久99 | 亚洲精品视频中文字幕 | 久久人人爽人人 | 欧美精品久 | 久久精品站 | 色老板在线| 亚洲精品中文在线资源 | 五月花激情 | 国产传媒一区在线 | 97超碰成人在线 | 日本不卡一区二区 | 99视频精品视频高清免费 | 国产在线污 | 免费在线中文字幕 | 九九视频精品在线 | 最新日韩在线观看视频 | 成人在线观看免费视频 | 色www精品视频在线观看 | 亚洲v欧美v国产v在线观看 | 偷拍福利视频一区二区三区 | 欧美精选一区二区三区 | 六月激情网 | 亚洲天天 | 亚洲欧洲精品视频 | 中文字幕乱码日本亚洲一区二区 | 日韩av在线免费看 | 婷婷久月 | 亚洲国产免费看 | 久草视频在线免费 | 成人资源在线观看 | 色wwww| 国产精品理论视频 | 国产 字幕 制服 中文 在线 | 三级黄色欧美 | 91精品视频一区二区三区 | 国产精品igao视频网网址 | a级片在线播放 | 久久天天躁夜夜躁狠狠85麻豆 | 亚洲v精品 | 欧洲精品在线视频 | 婷婷丁香九月 | 国产精品一区二区三区在线看 | 伊人色综合久久天天网 | 在线视频观看你懂的 | 国产高清av | 久久精品男人的天堂 | 国产99久久精品一区二区永久免费 | 国产精品不卡在线 | 五月婷婷综合激情网 | 夜夜操天天干, | 国产精品久久久久毛片大屁完整版 | 国产白浆在线观看 | 在线免费高清一区二区三区 | 成人教育av| 久久久国产毛片 | 丁香五婷 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久综合中文字幕 | 国产毛片久久 | 欧美另类xxxxx | 日韩 精品 一区 国产 麻豆 | 久久精品国产亚洲 | 97狠狠操 | 二区三区在线 | 丁香色综合 | 国产丝袜网站 | 日本成人黄色片 | 大型av综合网站 | 去看片| 少妇高潮流白浆在线观看 | 亚洲精品乱码久久久久久久久久 | 国产小视频免费在线观看 | 国产成人综合图片 | 91视频高清免费 | 国产伦理一区二区 | 99久久日韩精品视频免费在线观看 | 国产视频在线一区二区 | 亚洲午夜精品久久久久久久久久久久 | 伊人天天操 | 欧美另类z0zx | 最近中文字幕高清字幕免费mv | 五月花激情| 国产午夜精品一区二区三区四区 | 日韩三级av | 免费在线观看一级片 | 日韩在线视频网站 | 日本黄色一级电影 | 亚洲va欧美va国产va黑人 | 婷婷色六月天 | 在线直播av | 天天干天天拍 | 久黄色| 久青草国产在线 | 狠狠插狠狠操 | 正在播放国产精品 | 精品字幕在线 | 蜜臀av夜夜澡人人爽人人桃色 | 日韩欧美精品一区二区三区经典 | 成人免费视频a | www.久久成人 | 91亚洲激情 | 久久免费视屏 | 国产免费二区 | 麻豆精品视频在线观看免费 | 国产高清成人av | 久草国产在线观看 | 精品久久一二三区 | 国产成在线观看免费视频 | 成人网页在线免费观看 | av电影一区 | 91高清免费观看 | 日韩深夜在线观看 | 亚洲精品成人 | 麻豆国产网站入口 | 欧美一级看片 | 黄色精品一区 | 欧美aaa大片| 国产成人精品久久久久蜜臀 | 成人精品国产 | 亚洲成人黄色av | 免费日韩av电影 | 亚洲手机av | 精品国产一区二区在线 | 国产一区二区三区免费在线观看 | 久久成人国产精品免费软件 | 久久国产精品一区二区三区 | 亚洲资源一区 | 永久免费精品视频网站 | 日韩av一区二区三区在线观看 | 国内精品久久久久久久影视麻豆 | 欧美精品视 | 超碰电影在线观看 | 天天干天天操天天爱 | 激情视频免费在线 | 成人网在线免费视频 | 欧美日韩视频免费 | 日韩精品一区二区三区丰满 | 免费网站v | 97超碰在线人人 | 亚洲国产三级在线观看 | 亚洲综合视频在线播放 | 久久这里只有精品23 | 久久久久久久影院 | 免费在线色视频 | 亚洲国产成人在线播放 | 久久视影| 97色婷婷人人爽人人 | 天天操天天操天天操天天操天天操天天操 | 亚洲无吗视频在线 | 亚洲激情在线视频 | 国产麻豆视频免费观看 | 色婷婷狠狠操 | 日产乱码一二三区别在线 | 久久艹国产 | 亚洲一级电影 | 国产淫片免费看 | 久久精品亚洲一区二区三区观看模式 | 美女视频网 | 国产一区二区久久久久 | 久久经典视频 | 天天色天天射天天干 | 视频二区在线 | 香蕉免费在线 | 少妇性bbb搡bbb爽爽爽欧美 | 日韩在线高清视频 | 精品国产一区二区三区在线 | 亚洲欧美乱综合图片区小说区 | 亚洲美女精品区人人人人 | 丁香九月激情综合 | 免费福利片 | 国产成人三级在线播放 | 99久久精品免费看国产 | 黄色av一区二区三区 | 日日精品 | 超碰免费公开 | 不卡的av电影在线观看 | 一区二区三区av在线 | 一个色综合网站 | 91看片在线观看 | 欧美国产精品一区二区 | 国产亚洲精品久久久久久大师 | 免费久草视频 | 国产一区欧美一区 | 四虎8848免费高清在线观看 | 西西444www | 天天操夜| 国产高清在线一区 | 九色精品免费永久在线 | 久久黄色a级片 | 中文字幕免费不卡视频 | 国产精品麻豆欧美日韩ww | www.福利视频 | 亚洲码国产日韩欧美高潮在线播放 | 久久国产精品偷 | 一区二区免费不卡在线 | 黄色在线免费观看网站 | 国产精品99久久久久的智能播放 | 麻豆传媒精品 | 日本精品xxxx | 久久九九影视 | 91黄色在线观看 | 日韩一级片网址 | 97免费公开视频 | 免费观看91视频 | 一区二区精品在线 | 黄色成品视频 | 99高清视频有精品视频 | 色小说在线 | 中文字幕第 | 欧美坐爱视频 | 国产一区二区在线观看视频 | 国产精品嫩草影视久久久 | 成人资源在线播放 | 亚洲丁香日韩 | a视频在线观看 | 黄色毛片网站在线观看 | 国产精品3| 日本在线观看中文字幕无线观看 | 在线观看一级片 | 狠狠久久伊人 | 91av短视频 | 久久99精品久久久久久秒播蜜臀 | 麻豆视频在线播放 | 91亚·色| 毛片精品免费在线观看 | 韩国av一区二区三区在线观看 | 精品国产视频在线 | 中文字幕在线观看视频一区二区三区 | 国语久久 | 91精品啪在线观看国产81旧版 | 中文字幕乱码电影 | 亚洲视频在线播放 | 综合色婷婷 | 久久久久二区 | www久久久| 日韩高清观看 | 99精品国产成人一区二区 | 91亚洲精品国偷拍自产在线观看 | 久久99久久久久久 | 3d黄动漫免费看 | 香蕉97视频观看在线观看 | 久久久久久久久久久福利 | 欧美日韩首页 | 亚洲精品视频在线免费播放 | 成年人免费电影在线观看 | 日韩字幕 | 激情婷婷亚洲 | 久久精品高清视频 | 国产日韩精品在线观看 | 国产在线小视频 | 黄色av网站在线免费观看 | 五月开心综合 | 欧美在线不卡一区 | 天天爱天天操天天射 | 亚洲精品天天 | 日韩有码在线观看视频 | 免费观看不卡av | 国产精品一区二区62 | 国产福利在线免费 | 波多野结衣视频一区二区三区 | 麻豆国产电影 | 精品视频免费久久久看 | 在线免费视频你懂的 | 高清av免费看 | 亚洲aⅴ久久精品 | 69夜色精品国产69乱 | 国产v亚洲v | 成人午夜av电影 | 91视频久久| 狠狠色丁香婷婷综合基地 | 麻豆视频免费观看 | 精品国产黄色片 | 欧美在一区| 麻豆免费视频 | 亚洲人成免费 | 99热这里精品 | 日日爽夜夜爽 | 天天干天天做天天操 | 日日夜操| 久久国产免 | 国产精品一区二区av | 99视频在线观看一区三区 | 日日夜夜干 | 视频精品一区二区三区 | 91精品国产综合久久婷婷香蕉 | 在线精品视频免费播放 | 91丨九色丨国产在线 | 日韩精品一区二区三区高清免费 | 99久久精品国产一区 | 在线观看黄色国产 | 黄色高清视频在线观看 | 精品高清视频 | 免费观看xxxx9999片 | 日日夜夜操操操操 | 中文字幕123区 | 四虎国产永久在线精品 | 国产97碰免费视频 | 波多野结衣在线视频一区 | 婷婷六月网 | 成人中文字幕在线观看 | 99精品小视频 | 99热这里只有精品1 av中文字幕日韩 | 久久久久97国产 | 蜜臀av免费一区二区三区 | 亚洲精品在线一区二区 | 欧美精品一区二区蜜臀亚洲 | 这里只有精品视频在线观看 | 免费黄色小网站 | av高清影院 | 一区二区三区中文字幕在线 | 粉嫩av一区二区三区四区 | 国产视频一 | 国产一二三区在线观看 | 日本h视频在线观看 | 国产午夜激情视频 | 一区二区伦理 | 欧美va电影| 婷婷色中文网 | 91在线观看高清 | 高清日韩一区二区 | 夜夜爽天天爽 | 精品999 | 五月婷婷一级片 | 国产精品久久久久久久av电影 | 婷婷丁香五| 色视频成人在线观看免 | 国产成人亚洲精品自产在线 | 一级精品视频在线观看宜春院 | 欧美少妇xx | 国产精品h在线观看 | 伊人在线视频 | 成年人免费电影在线观看 | 久久美女精品 | 午夜精品一区二区国产 |