Öncelikle bir veritabanı oluştalım, Clickhouse içerisinde varsayılan olarak 3 adet veritabanı bulunmaktadır, bunların dışında biz kendi veritabanlarımızı oluşturarak logic olarak tablolarımızı gruplayabiliriz. Varsayılan olarak gelen veritabanları aşağıdaki gibidir;
- DEFAULT adı üstünde default veritabanıdır, ClickHouse kurulumu yapıldıktan sonra ilk olarak bağlantımız, default user ile default database e yapılmaktadır, sonrasında kendi kullanacağımız user ve database ayarlarını yapmalıyız. aksi durumda oluşturduğumuz tüm tablolar default database altında oluşacaktır.
- SYSTEM Yaklaşık 60 tane system tablosu bu veritabanı altındadır, Tüm dictionary bilgisi bu veritabanı altındaki tablo ve viewlar dadır.
- INFORMATIN_SCHEMA Tüm veritabanlarının metada sı buradadır, Tüm veritabanlarındaki tablo, view, kolon, schema , roller …. bilgileri burada tutulmaktadır.
Öncelikle bir veritabanı ve user create edelim; sonra bu veritabanına bağlanalım, ardından Table Engine yapısına bakalım ve birer örnek vererek bunları kavramaya çalışalım;
Syntax ;
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] [COMMENT 'Comment']
Örnek;
clickhouse :) create database testdb on cluster mycluster
clickhouse :) create user clickhouse_admin on cluster myclusteridentified by 'Welcome123' ;
Bir user oluşturduk bu userın yetkilerine bakalım;
clickhouse :) show grants for clickhouse_admin
SHOW GRANTS FOR clickhouse_admin
Query id: 202239ca-306b-4a44-bbc0-888e0d7ac768
Ok.
0 rows in set. Elapsed: 0.001 sec.
clickhouse_admin userın şu an hiçbir yetkisi yok; buna admin olacağı için tüm yetkileri verelim,
clickhouse :) GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION on cluster mycluster;
clickhouse :) show grants for clickhouse_admin
SHOW GRANTS FOR clickhouse_admin
Query id: b1509f6b-2d1f-4aae-ae95-e8f32d5ec4a3
┌─GRANTS FOR clickhouse_admin────────────────────────────┐
│ GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION │
└────────────────────────────────────────────────────────┘
1 row in set. Elapsed: 0.001 sec.
TABLE ENGINES
Bir Tablo oluştururken onun table engine türünüde belirlemeliyiz, bu seçimi yaparken;
- Tabloyu nerede ve nasıl tutacağız,
- Tabloya erişimimiz nasıl olacak ne tür sorgular kullanacağız
- Tabloya eşzamanlı ne kadar erişim olacak
- Data replikasyonu yapılmalımı
Yukarıdaki sorular ve benzer soruların cevaplarına göre Table Engine yapımızda ortaya çıkacaktır, İlk olarak en çok kullanılacak olan Table Engine Ailesi olan MergeTree
Table Engine çeşitlerine bakalım.
Engines in the family:
- MergeTree
- ReplacingMergeTree (Order by PK ya göre duplicate kayıtları replace ederek temizler, (PK ya göre değil ORDER BY ifadesine göre))
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
Ayrıca farklı veritabanları ile Integration için Table Engine çeşitleride vardır. OLAP sistemler diğer sistemlerden beslendiği için CLickHouse bu konuda oldukça zengin bir ekosistem oluşturmuş ve neredeyse tüm Veritabanları için bir Table Engine içermektedir.
Integration Engines
Engines in the family:
Special Table Engines
- Distributed
- MaterializedView
- Dictionary
- Merge
- File
- Null
- Set
- Join
- URL
- View
- Memory (Datayı yanlızca memoryde tutar restsrat ile data kaybedilir.)
- Buffer
- KeeperMap
Burada Tüm TableEngeen leri incelemeden önce Tablo oluşturma syntax ına bakalım;
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [compression_codec] [TTL expr1] [COMMENT 'comment for column'],
name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [compression_codec] [TTL expr2] [COMMENT 'comment for column'],
...
) ENGINE = engine
COMMENT 'comment for table'
Bir tabloyu kullanarak benzer bir tablo oluşturmak için;
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
Select sorgusu ile;
CREATE TABLE [IF NOT EXISTS] [db.]table_name[(name1 [type1], name2 [type2], ...)] ENGINE = engine AS SELECT ...
Örnek Olarak;
clickhouse :) create table db1.create_table_test on cluster mycluster (id UInt32, col1 String) ENGINE=MergeTree order by id;
--Biraz insert yapalım
clickhouse :) insert into db1.create_table_test values
(1,'test str 1'),
(2,'test str 2');
-- Bu tablonun bir benzerini yapalım;
clickhouse :) create table default.create_table_test_like as db1.create_table_test;
-- default altında oluşturduğumuz tabloyu describe edelim;
clickhouse :) desc default.create_table_test_like
DESCRIBE TABLE default.create_table_test_like
Query id: ac083333-5eee-44a8-9197-1c3696bf89de
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ UInt32 │ │ │ │ │ │
│ col1 │ String │ │ │ │ │ │
└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
2 rows in set. Elapsed: 0.001 sec.
--Select Query ile bir tablo oluşturalım,
clickhouse :) create table default.create_table_test_asselect (id UInt32, col1 String) ENGINE=MergeTree order by(id) as select * from db1.create_table_test;
DATA TYPES
ClickHouse da Data Data tipleri;
- Integer types: signed and unsigned integers (
UInt8
,UInt16
,UInt32
,UInt64
,UInt128
,UInt256
,Int8
,Int16
,Int32
,Int64
,Int128
,Int256
) - Floating-point numbers: floats(
Float32
andFloat64
) andDecimal
values - Boolean: ClickHouse has a
Boolean
type - Strings:
String
andFixedString
- Dates: use
Date
andDate32
for days, andDateTime
andDateTime64
for instances in time - JSON: the
JSON
object stores a JSON document in a single column - UUID: a performant option for storing
UUID
values - Low cardinality types: use an
Enum
when you have a handful of unique values, or useLowCardinality
when you have up to 10,000 unique values of a column - Arrays: any column can be defined as an
Array
of values - Maps: use
Map
for storing key/value pairs - Aggregation function types: use
SimpleAggregateFunction
andAggregateFunction
for storing the intermediate status of aggregate function results - Nested data structures: A
Nested
data structure is like a table inside a cell - Tuples: A
Tuple
of elements, each having an individual type. - Nullable:
Nullable
allows you to store a value asNULL
when a value is “missing” (instead of the column settings its default value for the data type) - IP addresses: use
IPv4
andIPv6
to efficiently store IP addresses - Geo types: for geographical data, including
Point
,Ring
,Polygon
andMultiPolygon
- Special data types: including
Expression
,Set
,Nothing
andInterval
Data Tipleri yukarıdaki gibi peki bildiğimiz data tipleri nerede dersek, system.data_type_families
içerisinde tüm data tiplerinin alias ları mevcuttur.
clickhouse :) select * from system.data_type_families;
SELECT *
FROM system.data_type_families
Query id: ba8f68bc-4a5a-44ce-aca0-f78fa60e0617
┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐
│ DateTime32 │ 1 │ │
│ Date32 │ 1 │ │
│ INET6 │ 1 │ IPv6 │
│ INET4 │ 1 │ IPv4 │
│ ENUM │ 1 │ Enum │
│ BINARY │ 1 │ FixedString │
│ GEOMETRY │ 1 │ String │
│ NATIONAL CHAR VARYING │ 1 │ String │
│ BINARY VARYING │ 1 │ String │
│ NCHAR LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER VARYING │ 1 │ String │
│ boolean │ 1 │ Bool │
│ NATIONAL CHARACTER LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER │ 1 │ String │
│ NATIONAL CHAR │ 1 │ String │
│ CHARACTER VARYING │ 1 │ String │
│ LONGBLOB │ 1 │ String │
│ TINYBLOB │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ VARCHAR2 │ 1 │ String │
│ CHARACTER LARGE OBJECT │ 1 │ String │
│ DOUBLE PRECISION │ 1 │ Float64 │
│ LONGTEXT │ 1 │ String │
│ NVARCHAR │ 1 │ String │
│ INT1 UNSIGNED │ 1 │ UInt8 │
│ VARCHAR │ 1 │ String │
│ CHAR VARYING │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ NCHAR │ 1 │ String │
│ VARBINARY │ 1 │ String │
│ CHAR │ 1 │ String │
│ TIMESTAMP │ 1 │ DateTime │
│ FIXED │ 1 │ Decimal │
│ NUMERIC │ 1 │ Decimal │
│ DEC │ 1 │ Decimal │
│ TIME │ 1 │ Int64 │
│ FLOAT │ 1 │ Float32 │
│ SET │ 1 │ UInt64 │
│ CLOB │ 1 │ String │
│ BLOB │ 1 │ String │
│ BINARY LARGE OBJECT │ 1 │ String │
│ YEAR │ 1 │ UInt16 │
│ MEDIUMINT │ 1 │ Int32 │
│ INTEGER │ 1 │ Int32 │
│ INT1 SIGNED │ 1 │ Int8 │
│ BIT │ 1 │ UInt64 │
│ BIGINT UNSIGNED │ 1 │ UInt64 │
│ BYTEA │ 1 │ String │
│ INT │ 1 │ Int32 │
│ DOUBLE │ 1 │ Float64 │
│ INT1 │ 1 │ Int8 │
│ CHAR LARGE OBJECT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ BIGINT │ 1 │ Int64 │
│ CHARACTER │ 1 │ String │
│ BYTE │ 1 │ Int8 │
└─────────────────────────────────┴──────────────────┴─────────────┘
131 rows in set. Elapsed: 0.001 sec.
ClickHouse içerisinde Standart Dışı bir çok data tipi vardır bunlar nelerdir;
- Arrays: any column can be defined as an
Array
of values ARRAY (T) T herhangi bir data tipi olabilir;
create table db1.array_table on cluster mycluster
(
id Array(UInt32),
messages Array(String),
timestamps Array(DateTime)
) ENGINE=MergeTree
Order By tuple();
-- Biraz Insert yapalım;
Insert Into db1.array_table values (
[5,3,12],
array ('Merhaba','ClickHouse'),
[1640995200,'2023-08-19 14:23:32']
)
--Sorgulayalım;
clickhouse :) select * from db1.array_table;
SELECT *
FROM db1.array_table
Query id: 93f78452-0417-4fb8-94ca-e72cf96fb02b
┌─id───────┬─messages─────────────────┬─timestamps────────────────────────────────────┐
│ [5,3,12] │ ['Merhaba','ClickHouse'] │ ['2022-01-01 03:00:00','2023-08-19 14:23:32'] │
└──────────┴──────────────────────────┴───────────────────────────────────────────────┘
- Nullable Kayıp değerler için Null değer kullanılmasını sağlar, bir örnek ile bakalım;
create table db1.nullable_table on cluster mycluster
(
device_id UInt32,
metric Nullable(UInt64)
) ENGINE=MergeTree
PRIMARY KEY device_id
clickhouse :) insert into db1.nullable_table Values
(101, 2611982),
(102,31082834),
(103,NULL)
clickhouse :) select * from db1.nullable_table
SELECT *
FROM db1.nullable_table
Query id: ae948688-bc48-45a7-99b8-e96a04351477
┌─device_id─┬───metric─┐
│ 101 │ 2611982 │
│ 102 │ 31082834 │
│ 103 │ ᴺᵁᴸᴸ │
└───────────┴──────────┘
3 rows in set. Elapsed: 0.002 sec.
NOT: Primary Key ve Primary Index olacak alanlar için NULAABLE data tipi kullanılamaz.
- Enum Bu data tipinde , tablo tanımlarında alabileceği değerler önceden tanımlanır.
create table db1.enum_demo on CLUSTER mycluster
(
id UInt32,
device_type ENUM('server'=1,'container'=2,'router'=3,'switch'=4)
)ENGINE=MergeTree
PRIMARY KEY id
-- Biraz Insert yapalım;
clickhouse :) insert into db1.enum_demo values (1,'router');
1 row in set. Elapsed: 0.003 sec.
clickhouse :) insert into db1.enum_demo values (2,'cluster');
Exception on client:
Code: 691. DB::Exception: Unknown element 'cluster' for enum
clickhouse :) insert into db1.enum_demo values (2,'SWITCH');
Exception on client:
Code: 691. DB::Exception: Unknown element 'SWITCH' for enum
clickhouse :) insert into db1.enum_demo values (2,'switch');
1 row in set. Elapsed: 0.003 sec.
clickhouse :) insert into db1.enum_demo values (2,'Switch');
Exception on client:
Code: 691. DB::Exception: Unknown element 'Switch' for enum,
clickhouse :) select * from db1.enum_demo;
SELECT *
FROM db1.enum_demo
Query id: acaaef42-e61a-4e00-ae5c-6bd84bdd5c20
┌─id─┬─device_type─┐
│ 1 │ router │
└────┴─────────────┘
┌─id─┬─device_type─┐
│ 2 │ switch │
└────┴─────────────┘
2 rows in set. Elapsed: 0.002 sec.
- Low cardinality types: use an
Enum
when you have a handful of unique values, or useLowCardinality
when you have up to 10,000 unique values of a column ; Kardianalty değeri düşük kolonlar için (cinsiyet kolonu gibi) bu data tipi kullanımı performansı artıracaktır, bu değer String olabilir ama her bir değer için bir integer değer tutulur.
create table db1.metrics
(
id UInt32,
types LowCardinality (String),
value Decimal(30,2)
) ENGINE=MergeTree
PRIMARY KEY(id,types)
-- Insert yapalım;
clickhouse :) Insert Into db1.metrics values
(101,'cpu',0.64),
(102,'disk',432.82),
(102,'available_disk',177.55),
(102,'cpu',0.05),
(103,'disk',59.74)
Bir yanıt yazın