建表“高效”,是指建表的速度快嗎?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語言,友善對照以及學習,再也不用擔心程式設計不及别人啦!還在等什麼,趕緊開通互動式分析用起來吧。
點選進入
互動式分析官網建好表之後,我們怎麼樣高效給表導資料呢?有了表資料,怎麼樣快速查詢呢,或者怎麼樣提高查詢性能呢?敬請期待下期内容吧!

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