Press ESC to close

CLICKHOUSE TABLE ENGINE AND DATA TYPES

Ö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:

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

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;

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 use LowCardinality 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

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir