在本章節中,會繼續介紹在ClickHouse資料庫中,SQL的語句用法與範例介紹。
我們可以使用該語句將指定的資料表進行刪除,該資料表會將資料與綱要一併做刪除,若加入了IF EXISTS
的從句時,指定要刪除的資料表若不存在,則不會跳出錯誤訊息。
若SYNC
加入之後,則執行DROP語句時候,不會有延遲的狀況發生,下列是幾個常見的DROP語句使用語法:
-- 刪除指定的資料庫
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] [SYNC]
-- 刪除指定的資料表
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] [SYNC]
-- 刪除指定的DICTIONARY
DROP DICTIONARY [IF EXISTS] [db.]name [SYNC]
-- 刪除指定的使用者
DROP USER [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
-- 刪除指定的角色
DROP ROLE [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
-- 刪除指定的行政策(row policy)設定
DROP [ROW] POLICY [IF EXISTS] name [,...] ON [database.]table [,...] [ON CLUSTER cluster_name]
-- 刪除指定的配額設定
DROP QUOTA [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
-- 刪除指定的設定
DROP [SETTINGS] PROFILE [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
-- 刪除指定的視圖(view)
DROP VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] [SYNC]
-- 刪除指定的函數
DROP FUNCTION [IF EXISTS] function_name [on CLUSTER cluster]
其中,刪除指定的函數是指使用CREATE FUNCTION
所建立的使用者定義函數,相關的SQL語法執行如下:
CREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b;
DROP FUNCTION linear_equation;
將上述的SQL語法執行的輸出訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b;
CREATE FUNCTION linear_equation AS (x, k, b) -> ((k * x) + b)
Query id: 852f7551-f62d-417d-a4b9-1f50809151ca
Ok.
0 rows in set. Elapsed: 0.007 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) DROP FUNCTION linear_equation;
DROP FUNCTION linear_equation
Query id: 09c86521-46ec-41eb-9e58-1cea9970d729
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
我們可以透過這個語句來檢查指定的資料表名稱是否存在在指定的資料庫中,回應的資料表只有一個result
欄位,此欄位型別為UInt8
,欄位值為0或1,0表示不存在,1表示存在。
相關的語法範例執行與輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) EXISTS TABLE default.simple_table;
EXISTS TABLE default.simple_table
Query id: caa41589-3996-485c-ab03-edb32daa994a
┌─result─┐
│ 1 │
└────────┘
1 row in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) EXISTS TABLE default.test;
EXISTS TABLE default.test
Query id: 55fdf8a7-2f7c-41dc-8a6b-b38be0100bbf
┌─result─┐
│ 0 │
└────────┘
1 row in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
我們可以使用此語句將指定的查詢動作或是執行資料表ALTER語句訂做(Mutations)進行中斷,相關的語法如下:
KILL QUERY [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.processes query>
[SYNC|ASYNC|TEST]
[FORMAT format]
執行上述的SQL語句範例如下:
-- 可以指定查詢的id進行中斷該查詢的動作
KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90'
-- 中斷指定使用者所有正在執行的查詢的動作,SYNC會等待所有的查詢相關的程序(prcoess)回應並顯示出訊息中止
KILL QUERY WHERE user='username' SYNC
ASYNC則是會立即中斷指定的查詢動作,若使用SYNC則會回應kill_status
欄位,可能欄位值如下:
我們可以透過下列的SQL語句將Mutations的動作進行中斷,相關的語句如下:
KILL MUTATION [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.mutations query>
[TEST]
[FORMAT format]
相關的範例如下:
-- 取消與移除所有單一指定的資料表的mutations動作
KILL MUTATION WHERE database = 'default' AND table = 'table'
-- 取消某個指定資料表中的特定mutation動作
KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt'
在要中斷的Mutation動作中,若已經對該資料表完成修改的動作,則不會進行回復(roll back)。
這個語句是試著將該資料表設定預定排程的動作直接執行,相關的語法如下:
OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]
該語句可以支援的資料表引擎如下:
當使用OPTIMIZE語句用在ReplicatedMergeTree系列的資料表引擎,若replication_alter_partitions_sync
設定為2
時,則ClickHouse資料庫會建立一個任務來在所有的資料複製點 (replicas)進行合併與等待執行,若設定replication_alter_partitions_sync
設定為1
時,則是在當前的資料複製點進行上述的任務。
optimize_throw_if_noop
為1,預設為0。BY
敘述式,則會完整的識別每行資料進行去重複,即所有的欄位會進行比較,這個機制對於MergeTree資料表引擎來說是很合理的。我們也可以透過設定replication_wait_for_inactive_replica_timeout
來描述OPTIMIZE語句執行時,等待不活躍的資料複製點(inactive replicas)可以多久,設定值單位為秒。
下列是有關於設定optimize_throw_if_noop
與執行OPTIMIZE語句的關係,相關的執行訊息輸出如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW SETTINGS LIKE '%noop%';
SHOW SETTINGS LIKE '%noop%'
Query id: b0dd48f8-a49d-4d4c-885b-5c825b8e8689
┌─name───────────────────┬─type─┬─value─┐
│ optimize_throw_if_noop │ Bool │ 0 │
└────────────────────────┴──────┴───────┘
1 row in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE simple_table;
OPTIMIZE TABLE simple_table
Query id: 4f3af355-81ce-4bfd-b123-3647021701d2
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SET optimize_throw_if_noop=1;
SET optimize_throw_if_noop = 1
Query id: 4b3f0ffa-8933-463d-8cc8-22e7c999a293
Ok.
0 rows in set. Elapsed: 0.001 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE simple_table;
OPTIMIZE TABLE simple_table
Query id: 5eba30ab-f336-4b3a-84e3-dbb4b0a7b666
0 rows in set. Elapsed: 0.001 sec.
Received exception from server (version 22.8.4):
Code: 388. DB::Exception: Received from localhost:9000. DB::Exception: Cannot OPTIMIZE table: There is no need to merge parts according to merge selector algorithm. Cannot select parts for optimization. (CANNOT_ASSIGN_OPTIMIZE)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
使用OPTIMIZE語句時,可以使用BY
敘述式可以指定相關的欄位進行不重複的檢查動作,相關的語法範例如下:
-- 針對所有的欄位
OPTIMIZE TABLE table DEDUPLICATE;
-- 除了MATERIALIZED與ALIAS欄位
OPTIMIZE TABLE table DEDUPLICATE BY *;
-- 針對colX、colY與colZ欄位
OPTIMIZE TABLE table DEDUPLICATE BY colX,colY,colZ;
-- 除了MATERIALIZED、ALIAS與colX欄位
OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT colX;
-- 除了MATERIALIZED、ALIAS、colX與colY欄位
OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT (colX, colY);
-- 針對符合置規表達式的欄位
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex');
-- 針對符合置規表達式的欄位以及排除colX欄位
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT colX;
-- 針對符合置規表達式的欄位以及排除colX與colY欄位
OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT (colX, colY);
針對上述相關的語法使用,所執行SQL語句範例與所輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE TABLE example (
primary_key Int32,
secondary_key Int32,
value UInt32,
partition_key UInt32,
materialized_value UInt32 MATERIALIZED 12345,
aliased_value UInt32 ALIAS 2,
PRIMARY KEY primary_key
) ENGINE=MergeTree
PARTITION BY partition_key
ORDER BY (primary_key, secondary_key);
CREATE TABLE example
(
`primary_key` Int32,
`secondary_key` Int32,
`value` UInt32,
`partition_key` UInt32,
`materialized_value` UInt32 MATERIALIZED 12345,
`aliased_value` UInt32 ALIAS 2
)
ENGINE = MergeTree
PARTITION BY partition_key
PRIMARY KEY primary_key
ORDER BY (primary_key, secondary_key)
Query id: 83d9c358-1cae-4fea-ae01-66300fc8f3f2
Ok.
0 rows in set. Elapsed: 0.007 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
INSERT INTO example (primary_key, secondary_key, value, partition_key) FORMAT Values
Query id: 82b4232e-e236-4e82-9bbe-b073d563e89a
Ok.
5 rows in set. Elapsed: 0.005 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM example;
SELECT *
FROM example
Query id: 6cb7fa94-8937-4574-b516-6f4ac55c3cc7
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
│ 1 │ 1 │ 3 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
5 rows in set. Elapsed: 0.011 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
上述的SQL語句,就是先建立一個example資料表,透過partition_key
欄位進行分區,接著使用INSERT INTO
語句建立5筆資料進去到該資料表。
接著我們執行OPTIMIZE TABLE example FINAL DEDUPLICATE;
語句之後,再去查詢example資料表,相關的語句與執行輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE example FINAL DEDUPLICATE;
OPTIMIZE TABLE example FINAL DEDUPLICATE
Query id: 7bb85ba6-768a-4483-869c-f4965bcdbf14
Ok.
0 rows in set. Elapsed: 0.004 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM example;
SELECT *
FROM example
Query id: 45611665-af6b-4e5f-9cc7-d27bda287dc1
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
│ 1 │ 1 │ 3 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
4 rows in set. Elapsed: 0.003 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
從上述的SQL語句可以發現,重複的資料因為OPTIMIZE
語句而被移除了,接著清空example資料表資料並重新寫入這5筆資料,接著執行OPTIMIZE TABLE example FINAL DEDUPLICATE BY *;
語句,相關的輸出訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) TRUNCATE TABLE example;
TRUNCATE TABLE example
Query id: 2be7845f-5ab7-45ed-98c1-23d82fd0f0b3
Ok.
0 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
INSERT INTO example (primary_key, secondary_key, value, partition_key) FORMAT Values
Query id: fe3854e8-1c68-40cc-81b6-e05718c36116
Ok.
5 rows in set. Elapsed: 0.004 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE example FINAL DEDUPLICATE BY *;
OPTIMIZE TABLE example FINAL DEDUPLICATE BY *
Query id: e79657cb-df95-4e71-b15c-66bf5d692248
Ok.
0 rows in set. Elapsed: 0.012 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) select * from example;
SELECT *
FROM example
Query id: 98ed7a48-4665-44bf-85ac-62d3c4c519c0
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
│ 1 │ 1 │ 3 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
4 rows in set. Elapsed: 0.003 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
接著重複清空資料表的資料與寫入同樣的5筆資料後,執行OPTIMIZE TABLE example FINAL DEDUPLICATE BY * EXCEPT value;
語句,相關的輸出訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) TRUNCATE TABLE example;
TRUNCATE TABLE example
Query id: c2499452-9254-4e15-88e9-dd040a318700
Ok.
0 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
INSERT INTO example (primary_key, secondary_key, value, partition_key) FORMAT Values
Query id: b6ba2bd1-a1f8-4728-879e-300736db122f
Ok.
5 rows in set. Elapsed: 0.005 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE example FINAL DEDUPLICATE BY * EXCEPT value;
OPTIMIZE TABLE example FINAL DEDUPLICATE BY * EXCEPT value
Query id: ac50ced7-645e-480d-b08e-68fd0a3e12be
Ok.
0 rows in set. Elapsed: 0.005 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) select * from example;
SELECT *
FROM example
Query id: 2c7c1a6a-cd1a-4337-8b66-d5eda49a2552
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
清空資料表資料後,並寫入同樣的5筆資料,則執行OPTIMIZE TABLE example FINAL DEDUPLICATE BY primary_key, secondary_key, partition_key;
語句後,相關輸出訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) TRUNCATE TABLE example;
TRUNCATE TABLE example
Query id: 6bdd4e44-d929-4f9b-be41-501f8451e94c
Ok.
0 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
INSERT INTO example (primary_key, secondary_key, value, partition_key) FORMAT Values
Query id: 9caf8c14-8a9d-47f2-aad4-83a1431046e8
Ok.
5 rows in set. Elapsed: 0.005 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE example FINAL DEDUPLICATE BY primary_key, secondary_key, partition_key;
OPTIMIZE TABLE example FINAL DEDUPLICATE BY primary_key, secondary_key, partition_key
Query id: 64efd774-28d5-4af1-81a6-090c41c4b402
Ok.
0 rows in set. Elapsed: 0.008 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) select * from example;
SELECT *
FROM example
Query id: 03cd3dab-0991-4d76-a4e8-bb3174e1ae1e
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
3 rows in set. Elapsed: 0.003 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
接著清空資料表的資料後,再寫入同樣的5筆資料,並執行OPTIMIZE TABLE example FINAL DEDUPLICATE BY COLUMNS('.*_key');
語句,相關的執行語句所輸出的訊息如下:
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) TRUNCATE TABLE example;
TRUNCATE TABLE example
Query id: 1c6ac939-d4d8-4c50-8c2d-9171cd519fe2
Ok.
0 rows in set. Elapsed: 0.002 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO example (primary_key, secondary_key, value, partition_key)
VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3);
INSERT INTO example (primary_key, secondary_key, value, partition_key) FORMAT Values
Query id: 7989429f-b602-4af6-a963-de1520d4ebe6
Ok.
5 rows in set. Elapsed: 0.006 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE example FINAL DEDUPLICATE BY COLUMNS('.*_key');
OPTIMIZE TABLE example FINAL DEDUPLICATE BY COLUMNS('.*_key')
Query id: 3783e81d-0dbd-40f2-af67-e024a671fddf
Ok.
0 rows in set. Elapsed: 0.004 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM example;
SELECT *
FROM example
Query id: 2020fad4-802b-4930-a1b4-17a4f4bd25e7
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 3 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 0 │ 0 │ 0 │ 0 │
└─────────────┴───────────────┴───────┴───────────────┘
┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐
│ 1 │ 1 │ 2 │ 2 │
└─────────────┴───────────────┴───────┴───────────────┘
3 rows in set. Elapsed: 0.009 sec.
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
在本章節中,我們展示了幾種SQL語法,在下一章節中,將會繼續展示更多其他的SQL語法操作與應用範例。