はじめに
本記事では、スーパープロジェクションを最適化する際、データベースデザイナーに与えるクエリの記述ポイントを紹介します。スーパープロジェクションの最適化については、以下の記事をご参照ください。
<スーパープロジェクションの最適化>
https://vertica-tech.ashisuto.co.jp/designed_super-projections/
データベースデザイナーにクエリを与えるメリット
最適化時、データベースデザイナーにクエリを与えることにより、格納されているデータの特性とクエリの特性の両方を考慮した最適化が行われます。クエリを与える/与えない場合の最適化結果イメージは以下のとおりです。
<最適前のデータ>
最適化前は以下のようにスーパープロジェクションにデータが格納されています。

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

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

クエリの記述ポイント
データベースデザイナーに与えるクエリの記述内容について、ポイントを以下にまとめています。なお、クエリスペシフィックプロジェクションを作成する場合は、上記に加えてシステムで使うDELETE文(UPDATE文とMERGE文を含む)も与えることを推奨しています。
上記により、DELETE文の処理時間が必要以上に長くなってしまうことを防止できます。
詳細は以下の記事をご参照ください。
<DELETEの注意点(3)>
https://vertica-tech.ashisuto.co.jp/delete-notice-3/
検証バージョンについて
この記事の内容はVertica 9.3で確認しています。更新履歴
2020/02/13 本記事を公開- 投稿タグ
- 最適化, スーパープロジェクション