天天看點

今天來聊聊怎麼高效建表

建表“高效”,是指建表的速度快嗎?no,都9012年了,想啥呢?建表高效是指,建的這張表,怎麼樣能夠快速的被查詢到,同樣資源條件下,查詢性能相比普通表表現更優!

在我們建表時,通常會給表附帶屬性,比如存儲形式、生命周期TTL等,同時也會建構一些索引,以便查詢的時候能夠更加高效的得出查詢結果。但是,不同的産品使用的程式設計語言又不一樣,建表的文法可能也會有些差别,那今天小編就來為大家講講,怎麼樣在互動式分析中高效建表,(偷偷告訴你,看了這個文章,你的建表速度也會更快哦)

1.字段

首先,一張最簡單的表由表名和字段組成,字段可以了解表,一張表的列名,而字段類型,就是每列字段的行資料類型,同一列的資料類型必須唯一,例如:一個名為age的列,不可能下面出現行資料為tom吧。示例建一張簡單的表如下,目前互動式分析支援的資料類型大家可以參考

文檔資料類型

CREATE TABLE  (
 id bigint ,
 name text ,
 time timestamptz ,
 c double precision 
);           

2.設定字段屬性

1)主鍵

首先是主鍵,即我們常說的pk(PRIMARY KEY),主鍵是資料表的唯一索引,比如學生表裡有學号和姓名,姓名可能有重名的,但學号确是唯一的,你要從學生表中搜尋一條紀錄如查找一個人,就隻能根據學号去查找,這才能找出唯一的一個,這就是主鍵。

CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);           

2)可空

其次是可空,可空的意思是,這一列的行資料可以為空值,即沒有資料。

CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision, //這一個字段可空
PRIMARY KEY (id)
);           

3)數組

接着是數組,關于數組的用法,建議大家參考互動式分析

文檔數組類型

3.設定表存儲屬性

建好一張表之後,需要伺服器來存儲表,表的存儲有行存和列存兩種方式。列存儲将所有記錄中相同字段的資料聚合存儲;行存儲将每條記錄的所有字段的資料聚合存儲。在互動式分析,兩種存儲都支援,但是預設為列存形式,列存對于olap場景較為友好,适合各種複雜查詢;行存對于kv場景比較友好,适合基于primary key的點查和scan。

示例建一張列存表:

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'column');
COMMIT;           

示例建一張行存表:

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'row');
COMMIT;           

4.設定表屬性

為了更好的查詢表,通常會給表設定一些屬性。

1)生命周期

表的生命周期是指,從最後一次更新資料時間開始算起,經過指定時間還未變動,則這張表會被自動回收。

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('my_table', 'time_to_live_in_seconds', '36000');
COMMIT;           

2)索引

建構索引是為了加快查詢表,在互動式分析中,可以建構的索引有以下幾種

  • 聚簇索引clustering key

聚集索引實際是排序索引,索引的的類型和列的順序關系嚴格相關。聚簇索引能夠加速使用者在索引列上的range和filter查詢,聚集索引有助于加速一定會帶某個列做為where條件的查詢。

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('my_table', 'clustering_key', 'id');
CALL SET_TABLE_PROPERTY('my_table', 'time_to_live_in_seconds', '36000');
COMMIT;           
  • 字典編碼dictionary encoding columns

字典編碼列,指定列的值建構字典映射。字典編碼可以将字元串的比較轉成數字的比較,加速group by、filter等查詢。預設所有text列都會被隐式地設定到 dictionary_encoding_columns 中。

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('my_table', 'clustering_key', 'id');
CALL SET_TABLE_PROPERTY('my_table', 'dictionary_encoding_columns', 'name');
CALL SET_TABLE_PROPERTY('my_table', 'time_to_live_in_seconds', '36000');
COMMIT;           
  • 位列圖bitmap columns

位圖索引在這些列上建構比特編碼。bitmap可以對segment内部的資料進行快速過濾,是以建議把where條件的等值查詢列建成比特編碼。預設所有text列都會被隐式地設定到bitmap_columns中。

BEGIN;
CREATE TABLE my_table (
 id bigint NOT NULL,
 name text NOT NULL,
 time timestamptz NOT NULL,
 c double precision NOT NULL,
PRIMARY KEY (id)
);
CALL SET_TABLE_PROPERTY('my_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('my_table', 'clustering_key', 'id');
CALL SET_TABLE_PROPERTY('my_table', 'bitmap_columns', 'name');
CALL SET_TABLE_PROPERTY('my_table', 'dictionary_encoding_columns', 'name');
CALL SET_TABLE_PROPERTY('my_table', 'time_to_live_in_seconds', '36000');
COMMIT;           

更多關于索引的使用,大家可以參見互動式分析文檔設定表屬性。

學習了這麼多内容,相信大家還是會有點疑惑,比如,互動式分析是相容Postgresql的,但是有些朋友可能對pg的部分文法不是特别熟悉,尤其是建構索引這一部分,call_set怎麼用到極緻還有點困惑,那在這樣的情況下,我怎麼才能高效的建表呢?

别擔心,互動式分析的神器--HoloStudio來了(關于HoloStudio的介紹,可以參見

《互動式分析六脈神劍》之Dataworks-HoloStudio初體驗

),使用HoloStudio的UI建表,不需要輸入代碼,隻需動動小手點一點,就能建好一張表哦。不信,看下圖:

今天來聊聊怎麼高效建表
今天來聊聊怎麼高效建表

有了UI建表,點點就能快速建表,并建構索引,大大節約時間,也節約文法學習成本,還能在下方編輯框中立即生成建表SQL語言,友善對照以及學習,再也不用擔心程式設計不及别人啦!還在等什麼,趕緊開通互動式分析用起來吧。

點選進入

互動式分析官網

建好表之後,我們怎麼樣高效給表導資料呢?有了表資料,怎麼樣快速查詢呢,或者怎麼樣提高查詢性能呢?敬請期待下期内容吧!

今天來聊聊怎麼高效建表

若您在使用過程中,有任何問題,或者對互動式分析感興趣,歡迎進釘釘群咨詢哦!

今天來聊聊怎麼高效建表