Postgres-XL的限制

  Postgres-XL是基於PostgreSQL的一個分佈式數據庫。node

  相比於PostgreSQL,XL的表的數據是能夠分佈到不一樣的datanode上的,對存在於不一樣的datanode上的數據進行處理,目前還存在不少限制。固然可能在之後的新版本中,會突破這些限制。sql

  下面針對postgres-xl-10r1版本進行測試,看看目前還存在哪些限制。數據庫

1. 分佈建不能更新

 1 select * from test2;  2  id | name  3 ----+------
 4   1 | 1
 5   2 | 2
 6   5 | 5
 7   3 | 3
 8   4 | 4
 9 (5 rows) 10 
11 postgres=# update test2 set name='b' where id=2; 12 UPDATE 1
13 
14 postgres=# update test2 set id=5 where name='5'; 15 2018-11-07 18:13:49.533 CST [1831] ERROR: could not plan this distributed update 16 2018-11-07 18:13:49.533 CST [1831] DETAIL:  correlated UPDATE or updating distribution column currently not supported in Postgres-XL. 17 2018-11-07 18:13:49.533 CST [1831] STATEMENT:  update test2 set id=5 where name='5'; 18 ERROR:  could not plan this distributed update 19 DETAIL:  correlated UPDATE or updating distribution column currently not supported in Postgres-XL. 20 
21 postgres=# select * from test2; 22  id | name 23 ----+------
24   1 | 1
25   5 | 5
26   2 | b 27   3 | 3
28   4 | 4
29 (5 rows)

 

2. 複雜查詢

  在PostgreSQL,表數據只放在一臺pc上,當兩個表關聯查詢時,能夠直接獲取到表數據進行join。可是在Postgres-XL中,表數據是分佈在不一樣的datanode上,datanode又可能分佈在不一樣的pc上;這時候兩個表進行關聯查詢須要從不一樣的datanode之間進行,若是是多個表進行關聯查詢,狀況更加複雜了。分佈式

2.1 非分佈鍵做爲條件限制

 1 postgres=# select * from test1,test2;  2  id | name | id | name  3 ----+------+----+------
 4   1 | a    |  1 | 1
 5  .  6  .  7  .  8   2 | b    |  2 | b  9  . 10  . 11  . 12   4 | d    |  4 | 4
13 (40 rows) 14 
15 postgres=# select * from test1,test2 where test1.name='b' and test2.name='b'; 16  id | name | id | name 17 ----+------+----+------
18   2 | b    |  2 | b 19 (1 row) 20 
21 postgres=# select * from test1,test2 where test1.name=test2.name; 22 2018-11-08 11:08:08.939 CST [1510] ERROR: cannot wait on a latch owned by another process 23 2018-11-08 11:08:08.939 CST [1405] LOG:  server process (PID 1510) was terminated by signal 11: Segmentation fault 24 2018-11-08 11:08:08.939 CST [1405] DETAIL: Failed process was running: Remote Subplan 25 2018-11-08 11:08:08.939 CST [1405] LOG: terminating any other active server processes 26 2018-11-08 11:08:08.940 CST [1436] WARNING: terminating connection because of crash of another server process 27  . 28  . 29           .

  當where條件中直接判斷兩個表字段是否相等時,報錯。屢次嘗試後,還出現過其餘錯誤(例如:「ERROR:  Couldn't resolve SQueue race condition after 10 tries」),有時候也能執行成功,證實這一查詢仍是存在很大的問題。post

 

2.2 非親和表的限制

  親和表,即兩張表的分佈類型和分佈鍵都一致,稱這兩張表爲親和表。測試

 表test3和表test4都是以id列做爲分佈鍵、分佈類型爲Modulo,test3和test4是親和表。this

 1 postgres=# \d+ test3  2                                                 Table "public.test3"
 3  Column |  Type   | Collation | Nullable |              Default              | Storage  | Stats target | Description  4 --------+---------+-----------+----------+-----------------------------------+----------+--------------+-------------
 5  id     | integer |           | not null | nextval('test3_id_seq'::regclass) | plain    |              | 
 6  name   | text    |           |          |                                   | extended |              | 
 7 Indexes:  8     "test3_pkey" PRIMARY KEY, btree (id)  9 Distribute By: MODULO(id) 10 Location Nodes: ALL DATANODES 11 
12 postgres=# \d+ test4 13                                    Table "public.test4"
14  Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 15 --------+---------+-----------+----------+---------+---------+--------------+-------------
16  id     | integer |           |          |         | plain   |              | 
17 Distribute By: MODULO(id) 18 Location Nodes: ALL DATANODES 19 
20 postgres=# select * from test3 order by id; 21  id | name 22 ----+------
23   1 | a 24   2 | b 25   3 | cc 26   4 | dd 27   5 | ee 28   6 | ff 29 (6 rows) 30 
31 postgres=# select * from test4 order by id; 32  id 33 ----
34   1
35   2
36   4
37   6
38   8
39 (5 rows) 40 
41 postgres=# select * from test4 a inner join test3 b on a.id=b.id order by a.id; 42  id | id | name 43 ----+----+------
44   1 |  1 | a 45   2 |  2 | b 46   4 |  4 | dd 47   6 |  6 | ff 48 (4 rows)

 

   下面是非親和表test2與test4的內鏈接查詢。結果是不正確的,並且有時執行查詢會報錯。spa

 1 postgres=# \d+ test2  2                                    Table "public.test2"
 3  Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description  4 --------+---------+-----------+----------+---------+----------+--------------+-------------
 5  id     | integer |           | not null |         | plain    |              | 
 6  name   | text    |           |          |         | extended |              | 
 7 Indexes:  8     "test2_pkey" PRIMARY KEY, btree (id)  9 Distribute By: HASH(id) 10 Location Nodes: ALL DATANODES 11 
12 postgres=# select * from test2 order by id; 13  id  | name 14 -----+------
15    1 | 1
16    2 | b 17    3 | 3
18    4 | 4
19    5 | 5
20    6 | 
21  111 | 
22  112 | 
23 (8 rows) 24 
25 postgres=# select * from test2 a inner join test4 b on a.id=b.id order by a.id; 26 2018-11-08 15:09:19.389 CST [1206] WARNING: Unexpected data on connection, cleaning. 27  id | name | id 28 ----+------+----
29   2 | b    |  2
30   4 | 4    |  4
31   6 |      |  6
32 (3 rows)

   一樣,outer join也存在同樣的問題,不支持非親和表的關聯查詢。可是,非親和表能夠進行cross join關聯查詢(沒有where條件)。code

2.3 子查詢限制

  子查詢也受到非親和表的限制,與2.2的狀況基本一致,就再也不去說明了。server

 

  特殊說明:2.2和2.3中提到非親和表的限制問題,我後來增長了一個節點datanode3。結果再進行非親和表關聯時都正常了,沒有再報錯(上面提到有兩個報錯),查出來的結果也徹底正確。這什麼狀況,鬱悶。後來再嘗試把節點datanode3從集羣中刪掉,也沒有重現分親和表限制的問題。

 

 

3. 支持特性

  這裏順便提一下Postgres-XL支持的特性吧,方便記錄一下在測試過程當中測試到的項。

  • CTE(通用表表達式),支持,可是裏面的sql也受到上面提到的限制問題
  • Windows function,支持,同上;
  • 集合操做,支持,同上;
  • 非分片列count(distinct),支持;
  • 支持跨分片更新;
  • 支持跨分片事務;

 

總結

   此次針對Postgres-XL去調研它目前存在的限制,主要仍是在查詢上限制比較大。在測試過程當中,沒有對全部的sql功能進行測試,也沒有太深刻去研究。

  若是在以上說明存在的限制(或者支持特性)有不符合pgxl實際狀況的,多是我我的的錯誤,歡迎大牛指出。

  但願Postgres-XL在之後的版本中,能把這些限制給解決掉,越作越完善。

相關文章
相關標籤/搜索