AntDB中tableoid等特殊字段使用注意事項

        AntDB是一款分佈式數據庫產品,其分佈式的特性決定了當咱們使用某些字段,例如tableoid和xc_node_id系統字段,及enum類型字段,xc_node_id,xc_node_str(), adb_node_oid() GUC變量可能出現如下問題。node

一、各個節點的值不同,作等值、比較操做時須要注意,結果可能不正確;git

二、order by操做可能無效,只要是各個節點相同的值內部存儲不相同的類型github

下面舉例說明:sql

建立表,插入數據。數據庫

create table tt(c1 int, c2 int, c3 text);分佈式

insert into tt values(1,1,'a'), (2,2,'b'), (3,3,'c'), (4,4,'d') ;post

 

tableoid各個節點的值有可能不同測試

postgres=# select tableoid, * from tt;3d

tableoid | c1 | c2 | c3postgresql

----------+----+----+----

16410 | 1 | 1 | a

16410 | 2 | 2 | b

16412 | 3 | 3 | c

16412 | 4 | 4 | d

(4 rows)

在coordinator上:

在datanode上,tableoid和pg_class中關於此表的行。

由此可知,在coordinator上和不一樣的datanode上,tableoid是有可能不一樣的,所以,利用tableoid去做join操做可能得不到預期結果。

例如,利用在coordinator上利用tableoid和pg_class的oid做join獲取表的名字,就得不到預期結果。

 

xc_node_id:

數據分佈在兩個datanode上,兩個datanode的xc_node_id不一樣。

 

postgres=# select xc_node_id, * from tt;

xc_node_id | c1 | c2 | c3

------------+----+----+----

1853972 | 1 | 1 | a

1853972 | 2 | 2 | b

709075352 | 3 | 3 | c

709075352 | 4 | 4 | d

(4 rows)

 

pgxc_node_str:不一樣節點的pgxc_node_str名字不一樣,與node表中起的名字同樣。

postgres=# select * from pgxc_node_str();

pgxc_node_str

---------------

coord0

(1 row)

postgres=# select * from pgxc_node_str();

pgxc_node_str

---------------

dm0

(1 row)

 

adb_node_oid:

postgres=# select * from adb_node_oid();

adb_node_oid

--------------

11990

(1 row)

datanode上顯示爲0

postgres=# select * from adb_node_oid();

adb_node_oid

--------------

0

(1 row)

 

枚舉類型字段:

測試:

CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple');

CREATE TABLE enumtest (col rainbow);

INSERT INTO enumtest values ('yellow'), ('red'), ('green'), ('orange');

SELECT * FROM enumtest WHERE col = 'orange';

SELECT * FROM enumtest WHERE col > 'orange';

 

在coordinator上查詢pg_enum:

postgres=# select * from pg_enum ;

enumtypid | enumsortorder | enumlabel

-----------+---------------+-----------

16388 | 1 | red

16388 | 2 | orange

16388 | 3 | yellow

16388 | 4 | green

16388 | 5 | blue

16388 | 6 | purple

(6 rows)

 

在datanode上查詢pg_enum:

postgres=# select * from pg_enum ;

enumtypid | enumsortorder | enumlabel

-----------+---------------+-----------

16385 | 1 | red

16385 | 2 | orange

16385 | 3 | yellow

16385 | 4 | green

16385 | 5 | blue

16385 | 6 | purple

(6 rows)

 

參考:

QQ交流羣:496464280

源碼地址:http://github.com/ADBSQL 

歡迎廣大postgresql愛好者使用和交流。

相關文章
相關標籤/搜索