はじめに

本記事では、スーパープロジェクションを最適化する際、データベースデザイナーに与えるクエリの記述ポイントを紹介します。
スーパープロジェクションの最適化については、以下の記事をご参照ください。

<スーパープロジェクションの最適化>
http://vertica-tech.ashisuto.co.jp/designed_super-projections/

データベースデザイナーにクエリを与えるメリット

最適化時、データベースデザイナーにクエリを与えることにより、格納されているデータの特性とクエリの特性の両方を考慮した最適化が行われます。
クエリを与える/与えない場合の最適化結果イメージは以下のとおりです。

<最適前のデータ>
最適化前は以下のようにスーパープロジェクションにデータが格納されています。


<クエリを与えずに最適化した場合>
格納されているデータのカーディナリティに基づいて、スーパープロジェクションのデータがソートされます。
本例ではエリアと店舗のカーディナリティが低いため、優先してソートされています。


<クエリを与えて最適化した場合>
クエリで使用しているWHERE句の項目と、データのカーディナリティを考慮して、スーパープロジェクションのデータがソートされます。
本例では「SELECT COUNT(*) FROM table1 WHERE 日付=’0701’」をクエリとして与えているため日付が最優先でソートされ、その次にエリアと店舗がソートされています。
上述の「クエリを与えずに最適化した場合」と比べて圧縮効率は下がっていますが、上記クエリがシステムでよく使用されるクエリだとすると、本例の方が多くの処理で高い性能を発揮できます。



クエリの記述ポイント

データベースデザイナーに与えるクエリの記述内容について、ポイントを以下にまとめています。

  • システムでよく使うクエリを与える
  • 複数のクエリを同時に与えることが可能
  • WHERE句のリテラル値は最適化の結果に影響しない(任意の値で可)
  • 結合処理を含むクエリもそのまま使用可能(各テーブルのプロジェクションを最適化する)
  • ビューに対するクエリもそのまま使用可能(自動的にビューの中身のクエリを読み込む)

  • なお、クエリスペシフィックプロジェクションを作成する場合は、上記に加えてシステムで使うDELETE文(UPDATE文とMERGE文を含む)も与えることを推奨しています。

  • DELETE文(UPDATE文とMERGE文を含む)も同時に与える

  • 上記により、DELETE文の処理時間が必要以上に長くなってしまうことを防止できます。
    詳細は以下の記事をご参照ください。

    <DELETEの注意点(3)>
    http://vertica-tech.ashisuto.co.jp/delete-notice-3/

    検証バージョンについて

    この記事の内容はVertica 9.3で確認しています。

    更新履歴

    2020/02/13 本記事を公開