スター スキーマとして編成された稼働中の MySQL データ ウェアハウスがあり、ETL プロセスを作成するために Talend Open Studio for Data Integration 5.1 を使用しています。このプロセスを 1 日に 1 回実行したいと思います。ディメンション テーブルの 1 つ (dimUser) には、約 200 万のレコードと 23 の列があると見積もっています。
Talend で小さなテスト ETL プロセスを作成しましたが、これは機能しましたが、毎日更新する必要があるかもしれないデータの量を考えると、現在のパフォーマンスでは不十分です。ETL プロセスでは、dimUser に 1,000 レコードを UPDATE または INSERT するのに 4 分かかります。レコード数と UPDATE または INSERT にかかる時間との間に線形関係があると仮定すると、ETL が 3 ~ 4 時間 (私の希望) で完了する方法はありません。
私は Java に慣れていないので、ETL を Python スクリプトとして作成しましたが、同じ問題に遭遇しました。ただし、INSERT のみを実行すると、プロセスがはるかに高速になることがわかりました。ボトルネックは UPDATE ステートメントが原因であると確信しています。
dimUser の主キーは自動インクリメント整数です。私の友人は、この主キーを破棄して、複数フィールドの主キー (私の場合は 2 ~ 3 フィールド) に置き換えることを提案しました。
ウェアハウスからテスト データを取り出してスキーマを変更する前に、関連する提案やガイドラインを提供してもらえますか
- データ ウェアハウスの設計
- ETL プロセス
- 毎日数百万件のレコードを ETL プロセスで INSERT または UPDATE することがどれほど現実的か
- 私の友人の提案は大いに役立ちますか
さらに情報が必要な場合は、お知らせください。投稿します。
更新 - 追加情報:
mysql> describe dimUser;
Field Type Null Key Default Extra
user_key int(10) unsigned NO PRI NULL auto_increment
id_A int(10) unsigned NO NULL
id_B int(10) unsigned NO NULL
field_4 tinyint(4) unsigned NO 0
field_5 varchar(50) YES NULL
city varchar(50) YES NULL
state varchar(2) YES NULL
country varchar(50) YES NULL
zip_code varchar(10) NO 99999
field_10 tinyint(1) NO 0
field_11 tinyint(1) NO 0
field_12 tinyint(1) NO 0
field_13 tinyint(1) NO 1
field_14 tinyint(1) NO 0
field_15 tinyint(1) NO 0
field_16 tinyint(1) NO 0
field_17 tinyint(1) NO 1
field_18 tinyint(1) NO 0
field_19 tinyint(1) NO 0
field_20 tinyint(1) NO 0
create_date datetime NO 2012-01-01 00:00:00
last_update datetime NO 2012-01-01 00:00:00
run_id int(10) unsigned NO 999
代理キーを使用したのは、それが良い習慣であると読んだからです。ビジネスの観点から、潜在的な不正行為に注意したいので (200 日間、ユーザーが状態 X に関連付けられ、その翌日には状態 Y に関連付けられているとします。移動したか、アカウントが移動した可能性があります)。そのため、地理データが保持されます。フィールド id_B には、関連付けられた id_A のいくつかの異なる値が含まれている可能性がありますが、個別の (id_A、id_B) タプルを知りたいと思っています。この情報のコンテキストで、私の友人は (id_A, id_B, zip_code) のようなものを主キーにすることを提案しました。
毎日の ETL プロセスの大部分 (>80%) では、次のフィールドのみが既存のレコードに対して更新されると予想しています: field_10 - field_14、last_update、および run_id (このフィールドは私の etlLog テーブルへの外部キーであり、 ETL 監査目的)。