ようこそClickHouseへ！ClickHouseについて簡単に説明します

# ClickHouseとは？
こんにちは！ClickHouse JapanのMasatoです。
ClickHouseは日本でのビジネスを本格的に展開するにあたりQiitaでClickHouseについてのTipsやユーザー事例などの記事を投稿していきます。なお公式ドキュメントはこちらです→[ClickHouse Docs](https://clickhouse.com/docs)

ClickHouse®は、高性能で列指向のSQLデータベース管理システム（DBMS）であり、オンライン分析処理（OLAP）に特化しています。オープンソースソフトウェアとしても、クラウドサービスとしても利用可能です。
日本でのサービスも提供しております。ぜひ一度ClickHouseのスピードを体験してください！

[ClickHouse Cloud](https://auth.clickhouse.cloud/u/signup/identifier?state=hKFo2SBwdVA3NldubEo2MU1TVGNzU2ZoT1YwMmVHRHl2d2hxb6Fur3VuaXZlcnNhbC1sb2dpbqN0aWTZIEk5NG9uRTNQUVo0WHd2amE3QlRkNks2YTVxa3RETW1ho2NpZNkgSVBwSDRSTkQwcU5YSFZheWVwZmZnc0dwYlhRbUZpa3I)
[ClickHouse Opensource](https://github.com/ClickHouse/ClickHouse)


# 分析とは何か？
分析（Analytics）、またはオンライン分析処理（OLAP）は、SQLクエリを用いて大規模データセットに対して複雑な計算（例: 集計、文字列処理、算術計算）を行うことを指します。

これとは異なり、トランザクションクエリ（OLTP: オンライントランザクション処理）は、1回のクエリで少数の行を読み書きするため、通常ミリ秒単位で完了します。一方で、分析クエリは日常的に数十億行から数兆行を処理します。

多くのユースケースでは、分析クエリは「リアルタイム」である必要があり、すなわち、1秒未満で結果を返すことが求められます。

# 行指向ストレージ vs. 列指向ストレージ
このような高いパフォーマンスは、適切なデータの「指向」によってのみ実現できます。

データベースは、行指向または列指向のいずれかの形式でデータを保存します。
行指向データベースでは、連続するテーブル行が順番に格納されます。このレイアウトでは、各行の列の値が一緒に保存されているため、行を素早く取得することができます。

一方、ClickHouseは列指向データベースです。このようなシステムでは、テーブルは列のコレクションとして保存されます。つまり、各列の値が順番に格納されます。このレイアウトでは、単一の行を復元するのが難しくなります（行の値の間にギャップが生じるため）が、フィルタリングや集計などの列操作は、行指向データベースに比べて大幅に高速になります。

この違いは、以下のような実例で説明するのが最も分かりやすいでしょう。ここでは、1億行の実際の匿名化されたWeb分析データに対してクエリを実行します。

`SELECT MobilePhoneModel, COUNT() AS c 
FROM metrica.hits 
WHERE 
      RegionID = 229 
  AND EventDate >= '2013-07-01' 
  AND EventDate <= '2013-07-31' 
  AND MobilePhone != 0 
  AND MobilePhoneModel not in ['', 'iPad'] 
GROUP BY MobilePhoneModel
ORDER BY c DESC 
LIMIT 8;`

このクエリは、ClickHouse SQL Playgroundで実行することができます。このクエリでは、100以上ある列の中からいくつかを選択し、フィルタリングを行います。その結果はミリ秒単位で返されます。

![column-oriented-example-query-bac6c51b672c49d367a4ffd7b5ec07ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963043/081b8cd7-fb35-8c54-9907-94f766996e0a.png)

上の図の統計セクションから分かるように、このクエリは1億行を92ミリ秒で処理しており、約3億行/秒、または約7GB/秒未満のスループットを達成しています。

###### 行指向DBMSの場合

行指向データベースでは、上記のクエリが既存の列の一部のみを処理する場合でも、他の列のデータをディスクからメモリに読み込む必要があります。その理由は、データがディスク上に「ブロック」と呼ばれるチャンク（通常は固定サイズ、例: 4KBまたは8KB）として保存されているからです。ブロックはディスクからメモリに読み込まれる最小単位です。

アプリケーションやデータベースがデータを要求すると、オペレーティングシステムのディスクI/Oサブシステムがディスクから必要なブロックを読み込みます。このとき、ブロックの一部のみが必要であっても、設計上、ディスク全体とファイルシステムの制約により、ブロック全体がメモリに読み込まれます。

![row-oriented-3e6fd5aa48e3075202d242b4799da8fa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963043/1c2a7bde-e234-d790-af79-6299be268960.gif)


###### 列指向DBMSの場合

列指向データベースでは、各列の値がディスク上で順番に格納されているため、上記のクエリを実行する際に不要なデータを読み込むことはありません。

ディスクからメモリへのブロック単位の保存と転送が、分析クエリのデータアクセスパターンに一致しているため、クエリで必要な列だけがディスクから読み込まれます。これにより、使用されないデータの不要なI/Oを回避できます。

これは、行指向ストレージと比較してはるかに高速です。行指向の場合、必要のない列を含む行全体が読み込まれるため、不要なデータ読み込みが発生します。
![column-oriented-d082e49b7743d4ded32c7952bfdb028f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963043/91609b89-2ee9-f724-c9be-6cf29c6f4d99.gif)

# データのレプリケーションと整合性
ClickHouseは、非同期のマルチマスターレプリケーション方式を採用しており、データが複数のノードに冗長的に保存されることを保証します。利用可能な任意のレプリカにデータが書き込まれると、残りのレプリカはバックグラウンドでそのコピーを取得します。この仕組みにより、異なるレプリカ間で同一のデータが維持されます。

ほとんどの障害からの復旧は自動的に行われますが、複雑なケースでは半自動的に対応することも可能です。

# ロールベースアクセス制御
ClickHouseは、SQLクエリを使用してユーザーアカウント管理を実装しており、ANSI SQL標準や一般的なリレーショナルデータベース管理システムで見られるようなロールベースのアクセス制御設定を可能にしています。

# SQLサポート
ClickHouseは、ANSI SQL標準と多くの点で同一の宣言型クエリ言語をサポートしています。サポートされているクエリ句には、GROUP BY, ORDER BY, FROM内のサブクエリ, JOIN句, IN演算子, ウィンドウ関数, およびスカラーサブクエリが含まれます。

# 近似計算
ClickHouseは、精度を犠牲にしてパフォーマンスを向上させる方法を提供します。例えば、一部の集計関数では、ユニークな値の数、中央値、パーセンタイルを近似的に計算します。また、データのサンプルを使用してクエリを実行することで、迅速に近似結果を得ることができます。さらに、すべてのキーではなく、限定された数のキーに対して集計を実行することも可能です。キーの分布がどれだけ偏っているかによりますが、これにより、正確な計算と比較してはるかに少ないリソースで合理的な精度の結果を得ることができます。

# 適応型結合アルゴリズム
ClickHouseは結合アルゴリズムを適応的に選択します。初めは高速なハッシュ結合を使用し、複数の大規模なテーブルが関与している場合はマージ結合に切り替えます。

# 優れたクエリパフォーマンス
ClickHouseは、非常に高速なクエリパフォーマンスで知られています。その理由について詳しく知りたい場合は、[Why is ClickHouse fast?](https://clickhouse.com/docs/en/concepts/why-clickhouse-is-so-fast) ガイドをご覧ください

# ClickHouseについてもっと知りたい方は
コミュニティイベントを開催します！ClickHouseをお使いの方はもちろん、検討中の方、少し気になる方、ただの興味本位でも参加オッケーです！ぜひ遊びに来てください！
[ClickHouse Meetup Tokyo](https://www.meetup.com/clickhouse-tokyo-user-group/events/305126993/?utm_medium=referral&utm_campaign=share-btn_savedevents_share_modal&utm_source=link)





こちらの投稿はClickHouse Docsを翻訳したものとなります。公式なドキュメントはこちらを参照してください。[ClickHouseDocs](https://clickhouse.com/docs)