CData Virtuality Server がクエリを処理し、最適化できると判断した場合、SYSADMIN.RecommendedOptimizations
テーブルに新しい行を作成して最適化を推奨します。推奨される最適化を受け入れる場合は、enableOptimization
ストアドプロシージャを使用できます。
基礎となるソース(Optimization が参照するテーブルおよびビュー)の構造または列名が変更された場合は、マテリアライゼーションを更新する必要があります。したがって、enableOptimization
プロシージャは、materializeNow
パラメータをTRUE
に設定して使用することができます。
Queries against the SYS
, SYSADMIN
, and pg_catalog
system schemas will not result in an optimization.
現在、CData Virtuality Server は 3種類のOptimization をサポートしています:MAT_TABLE
、MAT_JOIN
、およびMAT_AGGR
。 これらは、ユーザーが実行したクエリに応じてシステムが自動的に生成します。各Optimization の推奨は、ソーステーブル / ビューを表すマッチ記述子、またはシステムがユーザクエリを最適化するために具体化できる結合によって識別されます。
Type | Description |
---|---|
| Recommended optimization related to a single source table or view (e.g. generated by a query like |
| Recommended optimization related to one or more joins between two or more source tables or views (e.g. generated by a query like |
| Recommended optimization related to pre-aggregated tables (e.g. generated by a query like |
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 |
| Aggregation functions |
---|---|---|---|---|
1 | SELECT a, COUNT(b) FROM S.A GROUP BY a |
|
|
|
2 | SELECT a, SUM(b) FROM S.A GROUP BY a |
|
|
|
これらのMAT_AGGR
最適化がマテリアライズされた場合、対応するマテリアライズされたテーブルには、GROUP BY
列で報告されたフィールドと、集約関数の事前集約値のみが含まれます。
例えば、ソース・テーブルA
に以下のデータがあるとします:
a | b |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 2 |
3 | 2 |
3 | 10 |
MAT_AGGR
ID = 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(*)
.