CData Virtuality Server がクエリを処理し、最適化できると判断した場合、SYSADMIN.RecommendedOptimizationsテーブルに新しい行を作成して最適化を推奨します。推奨される最適化を受け入れる場合は、enableOptimizationストアドプロシージャを使用できます。

基礎となるソース(Optimization が参照するテーブルおよびビュー)の構造または列名が変更された場合は、マテリアライゼーションを更新する必要があります。したがって、enableOptimizationプロシージャは、materializeNowパラメータをTRUEに設定して使用することができます。 

Queries against the SYSSYSADMIN, and pg_catalog system schemas will not result in an optimization.

現在、CData Virtuality Server は 3種類のOptimization をサポートしています:MAT_TABLEMAT_JOIN、およびMAT_AGGR。 これらは、ユーザーが実行したクエリに応じてシステムが自動的に生成します。各Optimization の推奨は、ソーステーブル / ビューを表すマッチ記述子、またはシステムがユーザクエリを最適化するために具体化できる結合によって識別されます。

Type

Description

MAT_TABLE

Recommended optimization related to a single source table or view (e.g. generated by a query like SELECT * FROM A)

MAT_JOIN

Recommended optimization related to one or more joins between two or more source tables or views (e.g. generated by a query like SELECT * FROM A JOIN B ON A.a = B.b)

MAT_AGGR

Recommended optimization related to pre-aggregated tables (e.g. generated by a query like SELECT a, COUNT(b) FROM A GROUP BY a)

MAT_TABLEおよびMAT_JOINタイプの Optimizations は、一致記述子によって一意に識別され、有効な場合、ソース テーブルまたはビューで定義されたすべての列を複製します。MAT_AGGRタイプのOptimization は、そのマッチ記述子によって一意に識別されませんが、元のユーザークエリで使用される「GroupBy 列」と「Aggregation 関数」のリストで異なります。

例えば、次のようなクエリがあります:

SELECT a, COUNT(b) FROM S.A GROUP BY a;
 
SELECT a, SUM(b) FROM S.A GROUP BY a;

は、以下の表に示すように、テーブルAに関連する1つのMAT_TABLE最適化と、Aの両方をマッチ記述子として持ちながら異なる集約関数を持つ、2つのMAT_AGGR最適化を生成します:

ID

Query

Match descriptor

GROUP BY columns

Aggregation functions

1

SELECT a, COUNT(b) FROM S.A GROUP BY a

A

A.a

COUNT(A.b)

2

SELECT a, SUM(b) FROM S.A GROUP BY a

A

A.a

SUM(A.b)

これらのMAT_AGGR最適化がマテリアライズされた場合、対応するマテリアライズされたテーブルには、GROUP BY列で報告されたフィールドと、集約関数の事前集約値のみが含まれます。

例えば、ソース・テーブルAに以下のデータがあるとします:

a

b

1

1

1

2

2

1

2

2

3

2

3

10

MAT_AGGRID = 2の最適化に関連するマテリアライズドテーブルが作成されます:

sum_A_b

A_a

3

1

3

2

12

3


If both a MAT_TABLE and a MAT_AGGR optimizations are enabled for the same source table, the optimizer automatically chooses the best materialization to be used in the rewritten query, giving preference to the MAT_AGGR type if it matches the user query.

For example, the query SELECT SUM(b) FROM A will be rewritten using the materialized table related to MAT_AGGR with ID = 2.

On the contrary, the query SELECT SUM(a) FROM A does not match any MAT_AGGR optimization since the aggregation function is not materialized in any of them. In this case, the query will be rewritten accordingly to the MAT_TABLE optimization.

Please note that in the current version, only the following functions are supported by the MAT_AGGR optimizations: SUM(x), COUNT(x), and COUNT(*).