[Tableau]PostgreSQLのマテリアライズドビューを使用する

2015.08.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

みなさんこんにちは、yokatsukiです。今回のお題は、PostgreSQLのマテリアライズドビューをTableau Desktopから使用する方法について、ちょっとした注意点があったのでお伝えします。

その前にちょっと前置きを…。

マテリアライズドビューとは

マテリアライズドビューとは、PostgreSQL 9.3から実装されたデータを持つビューです。詳細は以下のSlideshareのスライドが詳しいのでご覧下さい。

マテリアライズドビューを使用するメリット

マテリアライズドビューは、通常のビューと違いデータを持つビューなので、元テーブルへの検索負荷を減らす事ができます。

同様の仕組みは手作業でサマリテーブルを作成することで実現できますが、マテリアライズドビューの場合は、リフレッシュ操作(SQL文は後述)だけでデータを更新できるので、メンテナンスが楽です。

マテリアライズドビュー使用上の注意点

ただし、現状のPostgreSQLのマテリアライズドビューは、リフレッシュの最中、ロックによる待ちが発生する事が知られています。これは9.4の新機能で改善しています。

マテリアライズドビューはTableau Desktopから使えない!?

さて、ここからが本題です。

Tableau Desktopで検索速度を上げる為の基本中の基本は、検索対象の母集団を減らせすことです。当たり前ですね。この為に、データベース側でマテリアライズドビューを使用するアイデアが出てくる訳ですが、残念ながらTableau Desktopではマテリアライズドビューがメニューに現れません。

具体的にどういうことか、実証します。PostgreSQL 9.4.1上のマテリアライズドビューにTableau Desktop 9.0.0でアクセスする形で確認します。

テーブルおよびマテリアライズドビューは、本家PostgreSQL 9.4.0文書の38.3. マテリアライズドビュー記載のINVOICEと、SALES_SUMMARYを使用します。

テーブルと、マテリアライズドビューの作成

クライアントから、以下SQL文を実行して、テーブルを作成します。

CREATE TABLE invoice (
    invoice_no    integer        PRIMARY KEY,
    seller_no     integer,       -- 販売員のID
    invoice_date  date,          -- 販売日
    invoice_amt   numeric(13,2)  -- 販売量
);

テーブルの型に合う適当なデータをExcel等で作成して、データのロードも行っておきます。

\COPY invoice FROM 'invoice.csv' WITH csv header

次に、INVOICEの販売量を販売員、販売日毎に集計するマテリアライズドビュー(ついでにマテリアライズドビュー用インデックス)を作成します。

CREATE MATERIALIZED VIEW sales_summary AS
  SELECT
      seller_no,
      invoice_date,
      sum(invoice_amt)::numeric(13,2) as sales_amt
    FROM invoice
    WHERE invoice_date < CURRENT_DATE
    GROUP BY
      seller_no,
      invoice_date
    ORDER BY
      seller_no,
      invoice_date;

CREATE UNIQUE INDEX sales_summary_seller
  ON sales_summary (seller_no, invoice_date);

念の為、マテリアライズドビューをリフレッシュしておきます。

REFRESH MATERIALIZED VIEW sales_summary;

これでマテリアライズドビューが完成しました。こちらをTableau Desktopから参照すると…。

tableau-use-postgres-mview-01

INVOICEテーブルと共に表示されることを期待していたマテリアライズドビューSALES_SUMMARYが表示されません。

解決法

Tableau Desktopからマテリアライズドビューを使用する方法として、以下2点を紹介します。

カスタムSQLを使用する

Talbeau Desktopのデータソースの設定画面には、"新しいカスタム SQL"のリンクがあります。これを使用して、直接マテリアライズドビューを指定する方法があります。

tableau-use-postgres-mview-02

  • 利点:マテリアライズドビューを直接呼び出せるので、不要なオーバーヘッドが無い
  • 欠点:事前にマテリアライズドビューの名前を知っておく必要がある

マテリアライズドビューを参照するビューを作成する

上記実験で確認した通り、Tableau Desktopはデータソースとしてマテリアライズドビューを参照できません。しかし通常のビューは参照できるので、マテリアライズドビューを参照するビューを作成することで対応する、というアイデアです。

CREATE VIEW sales_summary_view AS
  SELECT *
    FROM sales_summary;

再びTableau Desktopのデータソースを確認すると、ビューを参照することで、マテリアライズドビューが利用できるようになります。

tableau-use-postgres-mview-03

  • 利点:GUIで参照できる形で公開できる(ユーザに優しい)
  • 欠点:ビューを経由するので、SQL処理がひとつ余計に掛かる

まとめ

PostgreSQLのマテリアライズドビューは、そのままではTableau Desktopから参照できないということで、いくつかの対応方法を検討しました。

他にも方法があると思いますが、今後Tableau Desktopでマテリアライズドビューが直接参照できるようになったらありがたいなと思います。それでは、また。