0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-25

ClickHouseとは?

こんにちは!ClickHouse JapanのMasatoです。
ClickHouseは日本でのビジネスを本格的に展開するにあたりQiitaでClickHouseについてのTipsやユーザー事例などの記事を投稿していきます。なお公式ドキュメントはこちらです→ClickHouse Docs

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

ClickHouse Cloud
ClickHouse Opensource

分析とは何か?

分析(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

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

行指向DBMSの場合

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

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

row-oriented-3e6fd5aa48e3075202d242b4799da8fa.gif

列指向DBMSの場合

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

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

これは、行指向ストレージと比較してはるかに高速です。行指向の場合、必要のない列を含む行全体が読み込まれるため、不要なデータ読み込みが発生します。
column-oriented-d082e49b7743d4ded32c7952bfdb028f.gif

データのレプリケーションと整合性

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

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

ロールベースアクセス制御

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

SQLサポート

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

近似計算

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

適応型結合アルゴリズム

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

優れたクエリパフォーマンス

ClickHouseは、非常に高速なクエリパフォーマンスで知られています。その理由について詳しく知りたい場合は、Why is ClickHouse fast? ガイドをご覧ください

ClickHouseについてもっと知りたい方は

コミュニティイベントを開催します!ClickHouseをお使いの方はもちろん、検討中の方、少し気になる方、ただの興味本位でも参加オッケーです!ぜひ遊びに来てください!
ClickHouse Meetup Tokyo

こちらの投稿はClickHouse Docsを翻訳したものとなります。公式なドキュメントはこちらを参照してください。ClickHouseDocs

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?