創建本地表
建表語句基本語法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name ON CLUSTER cluster ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = engine_name() [PARTITION BY expr] [ORDER BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] [SETTINGS name=value, ...];
- db:指定數據庫名稱,如果當前語句沒有包含‘db’,則默認使用當前選擇的數據庫為‘db’。
- cluster:指定集群名稱,目前固定為default。ON CLUSTER 將在每一個節點上都創建一個本地表。
- type:該列數據類型,例如 UInt32。
- DEFAULT:該列缺省值。如果INSERT中不包含指定的列,那么將通過表達式計算它的默認值並填充它。
- MATERIALIZED:物化列表達式,表示該列不能被INSERT,是被計算出來的; 在INSERT語句中,不需要寫入該列;在SELECT *查詢語句結果集不包含該列。
- ALIAS :別名列。這樣的列不會存儲在表中。 它的值不能夠通過INSERT寫入,同時使用SELECT查詢星號時,這些列也不會被用來替換星號。 但是它們可以用於SELECT中,在這種情況下,在查詢分析中別名將被替換。
- 物化列與別名列的區別: 物化列是會保存數據,查詢的時候不需要計算,而別名列不會保存數據,查詢的時候需要計算,查詢時候返回表達式的計算結果
- PARTITION BY:指定分區鍵。通常按照日期分區,也可以用其他字段或字段表達式。
- ORDER BY:指定 排序鍵。可以是一組列的元組或任意的表達式。
- PRIMARY KEY: 指定主鍵,默認情況下主鍵跟排序鍵相同。因此,大部分情況下不需要再專門指定一個 PRIMARY KEY 子句。
- SAMPLE BY :抽樣表達式,如果要用抽樣表達式,主鍵中必須包含這個表達式。
- SETTINGS:影響 性能的額外參數。
- GRANULARITY :索引粒度參數。
示例,創建一個本地表:
CREATE TABLE ontime_local ON CLUSTER default ( Year UInt16, Quarter UInt8, Month UInt8, DayofMonth UInt8, DayOfWeek UInt8, FlightDate Date, FlightNum String, Div5WheelsOff String, Div5TailNum String )ENGINE = ReplicatedMergeTree( '/clickhouse/tables/ontime_local/{shard}', '{replica}') PARTITION BY toYYYYMM(FlightDate) PRIMARY KEY (intHash32(FlightDate)) ORDER BY (intHash32(FlightDate),FlightNum) SAMPLE BY intHash32(FlightDate) SETTINGS index_granularity= 8192 ;
高可用集群(雙副本),要用ReplicatedMergeTree等Replicated系列引擎,否則副本之間不進行數據復制,導致數據查詢結果不一致。
{shard},{replica} 參數不需要賦值。
創建分布式表
基於本地表創建一個分布式表。
創建分布式表基本語法:
CREATE TABLE [db.]table_name ON CLUSTER default AS db.local_table_name ENGINE = Distributed(<cluster>, <database>, <shard table> [, sharding_key])
- db:數據庫名。
- local_table_name:對應的已經創建的本地表表名。
- shard table:同上,對應的已經創建的本地表表名。
- sharding_key:分片表達式。可以是一個字段,例如user_id(integer類型),通過對余數值進行取余分片;也可以是一個表達式,例如rand(),通過rand()函數返回值/shards總權重分片;為了分片更均勻,可以加上hash函數,如intHash64(user_id)。
示例:創建一個分布式表:
--建立分布式表 CREATE TABLE ontime_distributed ON CLUSTER default AS db_name.ontime_local ENGINE = Distributed(default, db_name, ontime_local, rand());
復制另一個表結構
創建與另一個表相同結構的表,語法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name ON CLUSTER default AS [db.]name2 [ENGINE = engine];
表引擎可以通過ENGINE=engine字句指定,默認與被復制的表“name2”相同。
示例:
create table t2 ON CLUSTER default as db1.t1;
通過SELECT語句創建
使用指定的引擎創建一個與SELECT子句的結果具有相同結構的表,並使用SELECT子句的結果填充它。語法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name ON CLUSTER default ENGINE = engine AS SELECT ...
其中ENGINE是需要明確指定的。
示例:
create table t2 ON CLUSTER default ENGINE =MergeTree() as select * from db1.t1 where id<100;
創建臨時表
創建臨時語法如下:
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name ON CLUSTER default ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... )
通過TEMPORARY 關鍵字表示臨時表。大多數情況下,臨時表不是手動創建的,只有在分布式查詢處理中使用(GLOBAL) IN時為外部數據創建。
創建視圖
創建視圖語法如下:
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] ON CLUSTER default [ENGINE = engine] [POPULATE] AS SELECT ...
有MATERIALIZED關鍵字表示是物化視圖,否則為普通視圖。
假如用以下語句創建了一個視圖。
CREATE VIEW view_1 ON CLUSTER default AS SELECT a,b,c,d FROM db1.t1;
那么下列兩個語句完全等價。
SELECT a, b, c FROM view_1 ; SELECT a, b, c FROM (SELECT a,b,c FROM db1.t1);
物化視圖存儲的數據是由相應的SELECT查詢轉換得來的。
在創建物化視圖時,您還必須指定表的引擎 - 將會使用這個表引擎存儲數據。
目前物化視圖的工作原理:當將數據寫入到物化視圖中SELECT子句所指定的表時,插入的數據會通過SELECT子句查詢進行轉換並將最終結果插入到視圖中。
如果創建物化視圖時指定了POPULATE子句,則在創建時將該表的數據插入到物化視圖中。就像使用CREATE TABLE ... AS SELECT ...一樣。否則,物化視圖只會包含在物化視圖創建后的新寫入的數據。
我們不推薦使用POPULATE,因為在視圖創建期間寫入的數據將不會寫入其中。當一個SELECT子句包含DISTINCT, GROUP BY, ORDER BY, LIMIT時,請注意,這些僅會在插入數據時在每個單獨的數據塊上執行。例如,如果你在其中包含了GROUP BY,則只會在查詢期間進行聚合,但聚合范圍僅限於單個批的寫入數據。數據不會進一步被聚合。但是當你使用一些其他數據聚合引擎時這是例外的,如:SummingMergeTree。
目前對物化視圖執行ALTER是不支持的,因此這可能是不方便的。如果物化視圖是使用的TO [db.]name的方式進行構建的,你可以使用DETACH語句現將視圖剝離,然后使用ALTER運行在目標表上,然后使用ATTACH將之前剝離的表重新加載進來。視圖看起來和普通的表相同。例如,你可以通過SHOW TABLES查看到它們。
沒有單獨的刪除視圖的語法。如果要刪除視圖,請使用DROP TABLE。
