WeeklyAlteryxTips#93 データベースを使っていてデータ量が多い場合への対応

Alteryx

今回は、データベースを使っている方向けのお話となります。データベースを使っている場合に非常に大量のデータになっていると、データの処理に非常に苦労すると思います。まず、データベースにアクセスしてデータを取ってくるところで非常に時間がかかると思いますが、この対処法を見ていきたいと思います。

データベースの大量データへの対処法

データベースのデータが大量の場合、Alteryxからテーブルに対して接続する場合、SQL文は、

SELECT * FROM [テーブル名];

のような形になり、全件取得となってしまいます。しかし、大抵の場合、集計をかけたり、ある程度の範囲のデータ(ある月のデータなど)を抜き出したり、テーブルの全データが必要ではないケースもあるかと思います。このような場合は、データベースからデータを持ってくる際にデータを絞り込むことでデータ量を減らすことができます(特にSnowflakeやBigQueryなどのDWHなどになってくると相当量のデータを抱えていると思います)。

この場合、Alteryxでの対処法は2つあります。

  1. SQL文で対応する
  2. In-DBを使う

1.SQL文で対応する

SQL文で対応するためには、そのままSQLエディターでSQLを書くか、ビジュアルクエリビルダを使うかのどちらかの方法になります。初心者向きなのは、ビジュアルクエリビルダですが、複雑なSQLを書くにはちょっと大変かもしれません。

ビジュアルクエリビルダについての説明は過去の記事を参照ください。

SQLエディタで自由にSQLを書くこともできますが、ChatGPTやGeminiに聞けばある程度のものを作ってくれるので、これも一つの選択肢かもしれません。ただ、本当にちゃんと想定通りのものができているのか、という検証は必要ですし、SQLの知識がまったくないと難しいかもしれません。

2.In-DBを使う

次に、In-DBを使う方法をご紹介します。

In-DBはデータベース内処理という意味ですが、通常Designerは全てのデータをDesignerが動作しているPCのメモリに読み込み実行する、というスタイルを取っています。これに対してIn-DB機能を使うと、データベース内で処理をさせる、ということが可能です。これは、DBが高速な場合に処理をDB側で行わせることで高速化を図る、データ量を減らしてからDesigner側に持ってくる、などの効果があります。

In-DB機能を使うためには、Designerのツールパレットの「インデータベース」カテゴリのツールを使います(ちなみに、Designer CloudのNativeモードはすべてIn-DBで動いています)。

DBからデータを読み込む際は、「接続In-DB」ツールを使います。

これで読み出したデータはDB内にとどまっているため、とりあえず接続In-DBで繋いで実行しても一瞬で終わります。というのが、Designer側には実行結果は何も出力されないからです。In-DBカテゴリのツールを使う場合、アンカーをクリックしても何もデータは見れないので、「閲覧In-DB」を使ってデータを閲覧する必要があります。閲覧In-DBツールはデフォルトでは先頭の100レコードのみを閲覧できるため、これを追加してもそれほどワークフローの実行時間はかかりません(が、大量のデータの集計をしているような場合は少し待たされると思います)。

In-DBツールは、セレクト、サンプリング、結合、集計、ユニオン、フィルター、フォーミュラなど基本的なツールが揃っています。内部的には、Designer側でSQL文を生成し、DBに投げる、というのがこれらのツールの動作になるため、SQLベースで動いていると考えてください(SQLでできることができる、ということです)。フォーミュラIn-DBツールも、数式を使いたい場合は、接続しているデータベースで使える数式を書く必要があるため、若干のSQLの知識が必要とされることに注意してください。主な通常のツールとの違いは以下のとおりです。

  • 集計の種類が少ない
  • 結合は、SQLの結合と同等(内部結合、左結合、右結合、外部結合)
  • 数式類は全て接続しているデータベースのものを記述する必要がある
  • データ型の変更などはできない

ある程度集計やフィルタなどでデータを絞り込んだあとは、Designerの通常のツールを使ってデータの加工などを行いたいと思います。これを行うためには、データストリーム出力ツールを使います。これは、In-DBツール専用の青色のアンカーと通常のツールが接続可能な黄緑色のアンカーの2つを持っています。

これを使えば、In-DBで処理した結果をそのままDesigner側に持ってくることができます。例えば、以下のようなワークフローを作成可能です。

なお、この逆パターンのDesignerのデータをIn-DBでデータベース側に送り込むツール(データストリーム入力ツール)もあります。

In-DBを使えば、SQLでごちゃごちゃして何やっているかわからない、というふうにはなりにくいので、SQLを書くより処理の可視化という点では利点があります(正直な話、処理の速度だけ考えればSQLを書いたほうが処理速度的には有利かと思いますが、メンテとわかりやすさ含めて何を優先するかによります)。

WF開発の際の実行速度を改善する

ワークフローを作成するときは、なんどもワークフローを実行することになりますが、その都度DBから大量のデータを取得するとDBに負荷もかかりますし、時間もかかります(従量制のDBだと毎回お金がかかってしまいます)。このような場合、一旦取得したデータをキャッシングしておくのをおすすめします。

方法としては2つあります。

  1. ワークフローのキャッシュと実行を使う
  2. YXDBに保存しておく

1.ワークフローのキャッシュと実行を使う

ツールを右クリックすると出てくる「ワークフローのキャッシュと実行」を使えば、右クリックしたツールまでの処理を一旦キャッシュすることが可能です。これによりデータの読み込みからそのツールまでの処理がスキップされ、キャッシュされたデータを使ってその先のワークフローが動くようになります。

例えば、今回紹介したワークフローのデータストリーム出力ツールで右クリックしてみましょう。

このメニューの「ワークフローのキャシュと実行」をクリックします。

これにより、右クリックした部分まではキャッシュされ、設定などの変更はできません。そして、キャッシュがかかっていない部分のみが実行されます。

手軽で良いのですが、ワークフローの作りが複雑な場合にキャッシュ実行ができないケースがあるのでご注意ください。また、Designerを再起動したり、ワークフローを読み込み直すとキャッシュは消されてしまいます。

2.YXDBに保存しておく

データ入力ツールや、データストリーム出力ツールの直後にデータ出力ツールを配置し、yxdb形式のファイルでデータを保存することで、自分自身でキャシュファイルを作成することが可能です。yxdb形式のファイルは、Alteryx専用のデータ形式で、非常に高速に読み書きが可能となっています。

この場合、実行させたくない部分(データ入力ツール、もしくはIn-DBツール群)はコンテナツールで囲い、無効化しておきます。一方で、データ出力ツールは右クリックでデータ入力ツールに簡単に変換できるので、データ入力ツールに変換しておきます。

その後、ユニオンツールを使い、以下のようなワークフローにします。

本番ワークフローに切り替えるときは、キャッシュ用のデータ入力ツールを消すか、コンテナに格納し無効化します(完全に開発が終わったのであれば消したほうが良いと思います)。

まとめ

  • データベース内の大量データを扱い場合の対応方法を説明しました。
    • In-DBもしくはSQLを直接書くことで対応が可能です。
    • キャッシュやキャッシュ用にデータ入力ツールでYXDB形式で保存する方法をご紹介しました。

次回

未定です。

コメント

タイトルとURLをコピーしました