目錄
前言
一、創(chuàng)建表
1、選擇列的數(shù)據(jù)類型
2、設置表和列約束
3、選擇表分布策略
前言
????????數(shù)據(jù)庫的表與任何一種關系型數(shù)據(jù)庫中的表類似,不過其表中的行被分布在系統(tǒng)中的不同實例上。 當用戶創(chuàng)建一個表時,用戶會指定該表的分布策略。????????
一、創(chuàng)建表
????????CREATE TABLE命令創(chuàng)建一個表并且定義它的結果。當用戶創(chuàng)建一個表示,用戶需要定義:
-
該表的列以及它們的數(shù)據(jù)類型
-
大型表的表分區(qū)策略
-
表存儲在磁盤上的方式
-
表的分布策略,這決定了 數(shù)據(jù)庫如何在 實例 之間劃分數(shù)據(jù)
-
任何用于限制列或者表中能包含的數(shù)據(jù)的表或者列約束
1、選擇列的數(shù)據(jù)類型
????????一個列的數(shù)據(jù)類型決定了該列能包含的數(shù)據(jù)的類型。 選擇的數(shù)據(jù)類型應使用最少的空間,但仍能容納用戶的數(shù)據(jù)并且能最好地約束數(shù)據(jù)。 例如,對字符串使用character數(shù)據(jù)類型,對于日期使用date或者timestamp數(shù)據(jù)類型,而對數(shù)字使用numeric數(shù)據(jù)類型。
????????對于包含文本數(shù)據(jù)的表列,應指定數(shù)據(jù)類型為VARCHAR或者TEXT。 不推薦指定數(shù)據(jù)類型為CHAR。 在數(shù)據(jù)庫中數(shù)據(jù)類型VARCHAR或者TEXT會把加在數(shù)據(jù)后面的邊距(在最后一個非空白字符后面增加的空白字符)處理為有效字符,而數(shù)據(jù)類型CHAR不會這樣做。
????????使用能容納用戶的數(shù)字型數(shù)據(jù)的且允許未來擴張的最小數(shù)字數(shù)據(jù)類型。 例如,為適合INT或SMALLINT的數(shù)據(jù)使用BIGINT會浪費存儲空間。 如果用戶預期用戶的數(shù)據(jù)值將會隨著時間擴張,應該考慮到在裝載大量數(shù)據(jù)后從較小的數(shù)據(jù)類型更改成較大的數(shù)據(jù)類型需要很大的代價。 例如,如果用戶當期的數(shù)據(jù)值適合SMALLINT,但是很可能值會擴張,這樣INT就是更好的長期選擇。
????????對用戶計劃要用在交叉表連接中的列使用相同的數(shù)據(jù)類型。 交叉表連接通常使用一個表中的主鍵和其他表中的外鍵。 當數(shù)據(jù)類型不同時,數(shù)據(jù)庫必須轉換其中之一以便數(shù)據(jù)值能被正確地比較,這會增加不必要的開銷。
2、設置表和列約束
????????用戶可以在列和表上定義約束來限制表中的數(shù)據(jù)。數(shù)據(jù)庫支持和PostgreSQL相同的約束,但是有一些限制,包括:
-
CHECK 約束只能引用它所在的表
-
UNIQUE 和 PRIMARY KEY約束必須和它們所在表的分布鍵和分區(qū)鍵兼容
-
用戶在分區(qū)表上定義的約束將作為整體應用到分區(qū)表上。用戶不能在該表的單獨的部分上定義約束
-
允許 FOREIGN KEY 約束,但不會被強制
????????檢查約束允許用戶指定一個特定列中的值必須滿足一個布爾(真值)表達式。例如,要求正的產(chǎn)品價格:
=> CREATE TABLE products
( product_no integer,
name text,
price numeric CHECK (price > 0) );
=> CREATE TABLE products
( product_no integer NOT NULL,
name text NOT NULL,
price numeric );
=> CREATE TABLE products
( product_no integer UNIQUE,
name text,
price numeric)
DISTRIBUTED BY (product_no);
=> CREATE TABLE products
( product_no integer PRIMARY KEY,
name text,
price numeric)
DISTRIBUTED BY (product_no);
3、選擇表分布策略
????????所有的數(shù)據(jù)庫表都會被分布。 當用戶創(chuàng)建或者修改一個表時,用戶可以有選擇地指定DISTRIBUTED BY(哈希分布),DISTRIBUTED RANDOMLY(隨機分布),或DISTRIBUTED REPLICATED(全分布)來決定該表的行分布。
????????在決定表分布策略時,請考慮以下幾點:
-
均勻數(shù)據(jù)分布均 — 為了最好的性能,所有的 實例 應該包含等量的數(shù)據(jù)。如果數(shù)據(jù)不平衡或者傾斜,具有更多數(shù)據(jù)的實例 就必須做更多工作來執(zhí)行它那一部分的查詢處理。 請選擇對于每一個記錄都唯一的分布鍵,例如主鍵
-
均勻查詢處理? — 為了最好的性能,所有的 實例 應該處理等量的查詢負載。 如果一個表的數(shù)據(jù)分布策略與查詢謂詞匹配不好,查詢負載可能會傾斜。 例如,假定一個銷售事務表按照客戶ID 列(分布鍵)分布。 如果查詢中的謂詞引用了一個單一的客戶ID ,該查詢處理工作會被集中在一個 實例上
?????????復制表分布策略(DISTRIBUTED REPLICATED)應該在小表上使用。 將大表數(shù)據(jù)復制到每個節(jié)點上無論在存儲還是維護上都是有代價的。 復制表最基本的用例是:
-
可以對節(jié)點執(zhí)行刪除用戶定義的函數(shù)限制
-
頻繁使用的表不需要廣播到所有節(jié)點可以提高查詢性能
?????????為了保證哈希分布數(shù)據(jù)的均勻分布,最好選一個唯一鍵作為分布列。 如果找不 到,則選擇DISTRIBUTED RANDOMLY。例如:文章來源:http://www.zghlxwxcb.cn/news/detail-702910.html
=> CREATE TABLE products
(name varchar(40),
prod_id integer,
supplier_id integer)
DISTRIBUTED BY (prod_id);
=> CREATE TABLE random_stuff
(things text,
doodads text,
etc text)
DISTRIBUTED RANDOMLY;
????????如果沒有主鍵,但是有唯一索引存在,則選擇它為分布鍵。文章來源地址http://www.zghlxwxcb.cn/news/detail-702910.html
到了這里,關于人大金倉分析型數(shù)據(jù)庫使用之創(chuàng)建和管理表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!