1. 最初の状況
source.table Materialization前
id
|
orderDate
|
description
|
---|---|---|
1 | 2010/01/01 | descr_1 |
2 | 2011/01/01 | descr_2 |
3 | 2012/01/01 | descr_3 |
2. 最適化ジョブの実行(フルコピー):
source.table は、まず dwh.table に完全にコピーされます:
id
|
orderDate
|
description
|
---|---|---|
1 | 2010/01/01 | descr_1 |
2 | 2011/01/01 | descr_2 |
3 | 2012/01/01 | descr_3 |
3. Source テーブルが成長し、いくつかの行が更新されます(青色でハイライトされます)
id | orderDate | description |
---|---|---|
1 | 2010/01/01 | descr_1 |
2 | 2013/02/01 | descr_2_changed |
3 | 2012/01/01 | descr_3_changed |
3.1 | 2012/01/01 | descr_3.1 |
4 | 2012/06/01 | descr_4 |
5 | 2013/02/01 | descr_5 |
id=2の行のorderDate の値が更新され、新しい値がcheckExpressionValue と一致します。
4. インクリメンタル最適化ジョブの実行 (newRowCheckExpression = "orderDate", identityExpression = "'id'", deleteOldDate= "true")
4.1 Materialized Table にすでにあるデータの検索
すでにdwh.table に存在する最後の行を推定するために、インクリメンタルジョブは、最初に以下を発行し
SELECT
MAX
(orderDate)
as
checkExprValue
FROM
dwh.
table
そして以下を取得します
checkExprValue =
'2012/01/01'
4.2 DELTA テーブルの作成と入力
DELTA は以下のように計算されます:
SELECT
*
INTO
dwh.delta
FROM
source.
table
WHERE
orderDate >=
'2012/01/01'
dwh.delta
id | orderDate | description |
---|---|---|
2 | 2013/02/01 | descr_2_changed |
3 | 2012/01/01 | descr_3_changed |
3.1 | 2012/01/01 | descr_3.1 |
4 | 2012/06/01 | descr_4 |
5 | 2013/02/01 | descr_5 |
4.3.b 元の Materialized Tableから更新する行を削除します (identityExpression 値を使用)。
DELETE
FROM
dwh.
table
WHERE
id
IN
(
SELECT
id
FROM
dwh.delta)
その後、Materialized Tableには以下の行が含まれます:
dwh.table
id | orderDate | description |
---|---|---|
1 | 2010/01/01 | descr_1 |
Please, note that the identity expression is provided as a SQL code and it will be injected in the DELETE statement as follows:
DELETE
FROM
dwh.
table
WHERE
<identityExpression>
IN
(
SELECT
<identityExpression>
FROM
dwh.delta)
If the identity expression should contain more than one column, it can be done by concatenating them to a string
CONCAT (
CAST
( id
as
string ), STRINGCOL1 )
Please pay attention to substituting null values and data types which cannot be implicitly cast to string have to be cast explicitly: xml, clob. Data types which cannot be cast to a string cannot be used in identity expression: blob, object.
4.4 元のマテリアライズドテーブルにDELTA を追加します。
次のように計算され
INSERT
INTO
dwh.
table
SELECT
*
FROM
dwh.delta
以下の結果になります
dwh.table
id | orderDate | description |
---|---|---|
1 | 2010/01/01 | descr_1 |
2 | 2013/02/01 | descr_2_changed |
3 | 2012/01/01 | descr_3_changed |
3.1 | 2012/01/01 | descr_3.1 |
4 | 2012/06/01 | descr_4 |
5 | 2013/02/01 | descr_5 |
It is important to note that using the identityExpression prevented the generation of duplicates. If the identityExpression were NULL, two rows with id = 2 would have been copied into the materialized table.