iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

ClickHouse:時序資料庫建置與運行系列 第 19

day19-SQL使用與操作方法介紹(十)

  • 分享至 

  • xImage
  •  

前言

在本章節中,會繼續介紹在ClickHouse資料庫中,SQL的語句用法與範例介紹。

DROP語句

我們可以使用該語句將指定的資料表進行刪除,該資料表會將資料與綱要一併做刪除,若加入了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 :)

EXISTS語句

我們可以透過這個語句來檢查指定的資料表名稱是否存在在指定的資料庫中,回應的資料表只有一個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 :)

KILL語句

我們可以使用此語句將指定的查詢動作或是執行資料表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欄位,可能欄位值如下:

  • finished – 該查詢動作已經成功的中斷。
  • waiting – 等待該查詢動作在收到中斷信號後結束。
  • 其他的值則是會解釋為什麼該查詢動作不會停止的原因。

我們可以透過下列的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語句

這個語句是試著將該資料表設定預定排程的動作直接執行,相關的語法如下:

OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]

該語句可以支援的資料表引擎如下:

  • MergeTree系列家族的資料表引擎。
  • MaterializedView的資料表引擎。
  • Buffer資料表引擎。

當使用OPTIMIZE語句用在ReplicatedMergeTree系列的資料表引擎,若replication_alter_partitions_sync設定為2時,則ClickHouse資料庫會建立一個任務來在所有的資料複製點 (replicas)進行合併與等待執行,若設定replication_alter_partitions_sync設定為1時,則是在當前的資料複製點進行上述的任務。

  • 當執行OPTIMIZE語句執行時,且該資料表沒有相關可以讓OPTIMIZE觸發的設定時,則不會有錯誤訊息輸出在客戶端的終端機上,如果要有輸出的訊息,則可以設定optimize_throw_if_noop為1,預設為0。
  • 當使用OPTIMIZE語句指定的是一個區間(PARTITION)時,則只有指定的區間會進行optimized的動作。
  • 如果在設定OPTIMIZE語句中指定FINAL,即使所有資料已經在一個區間中,仍會執行OPTIMIZE動作,即使執行併發合併動作,也會進行強制合併。
  • 如果OPTIMIZE語句指定DEDUPLICATE,且沒有設定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語法操作與應用範例。


上一篇
day18-SQL使用與操作方法介紹(九)
下一篇
day20-SQL使用與操作方法介紹(十一)
系列文
ClickHouse:時序資料庫建置與運行30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言