3つのX投稿が目に留まりました。

SEARCH関数の活用法。クエリ効率化のTips

HyperLogLogが数億のカウントを2%精度で12,000ビットで実現。Redis/Elastic/Clickhouse/Hadoop共通のキーアルゴリズム

Snowflakeのプルーニングに関する論文。「LIMIT pruningが巧妙。一度理解すれば驚異的」

派手なAI機能の裏で、こういう地味な機能が進化している。調べてみました。

SEARCH関数

テキストデータの中から特定のキーワードを検索する機能です。

SELECT * FROM inquiries
WHERE SEARCH('内容', 'キャンセル OR 返品');

全文検索的な使い方ができます。使い道としては:

  • 問い合わせログの分析 — 「キャンセル」「返品」が含まれるレコードを一括抽出
  • アンケートの自由記述欄の分類 — 特定のキーワードで傾向を掴む
  • SNS投稿の分析 — ブランドに関する言及を検出

LIKEやCONTAINSでもできる話ですが、SEARCH関数はオプティマイザに最適化されていてパフォーマンスが良い。大量のテキストデータを扱う場合に差が出ます。

HyperLogLog: 「何種類あるか」を爆速で数える

これが一番面白かった。

通常、ユニーク数を数えるにはCOUNT(DISTINCT ...)を使います。でもこれは全データを読む必要がある。1億行なら1億行読む。

-- 正確だけど遅い
SELECT COUNT(DISTINCT user_id) FROM events;

-- 精度98%だけど1000倍速い
SELECT APPROX_COUNT_DISTINCT(user_id) FROM events;

HyperLogLogの仕組みを簡単に説明すると:

  1. 各値のハッシュ値を計算する
  2. ハッシュ値の先頭にある0の連続数を数える
  3. 統計的にユニーク数を推定する

12,000ビット(約1.5KB)のメモリ で数億のユニークカウントが可能。精度は約98%。

「このデータ、何件のユニークユーザーがいるの?」にすぐ答えられるかどうかが、データ基盤への信頼に直結します。正確に100万件なのか、推定で99万8千件なのかは、多くのビジネス判断では違いにならない。

Redis、Elasticsearch、ClickHouse、Hadoopでも使われている共通技術です。Snowflakeに限った話ではないですが、SQLの中で自然に使えるのが便利。

LIMIT Pruning: 必要なデータだけ読む

Snowflakeのプルーニングに関する論文が共有されていて読んでみました。

SELECT * FROM table LIMIT 10のとき、全データを読まずに済む仕組みです。Snowflakeはデータをマイクロパーティションという単位で管理していて、必要なパーティションだけ読む。

プルーニングが効くと、 スキャン量が劇的に減る = コストが下がる

Apache DataFusionでもほぼ全てのテクニックが実装されているとのことで、データ基盤全体のトレンドとして「読むデータ量を減らす」方向に進化しているようです。

Frosty Fridayが面白い

Snowflakeの技術を学ぶ場として、Frosty Fridayというコミュニティが面白いです。毎週金曜にSnowflakeのチャレンジ問題が出題されて、日本からも参加している方が配信で盛り上がっている。

「こんな関数あったんだ!」という発見が共有される場で、SWT Tokyo(Snowflake User Group Tokyo)も含めて日本のSnowflakeコミュニティは思ったより活発でした。

まとめ

  • 派手なAI機能より、SEARCH・HyperLogLog・Pruningのような地味な機能が実務では効く
  • 「速い」「安い」「正確」を支えているのはこういう技術
  • Frosty Fridayコミュニティは学びの場として良い
  • 次の記事では、パフォーマンス分析機能を見てみます