2

データをファクト テーブルにロードしています。Snowflake の元の一時テーブルは次のようになります。

ここに画像の説明を入力

フィールドindicator_nbrは、調査内で尋ねられる質問です。

倉庫データベースの構築にはデータ モデリング手法を使用しているため、データは次のようにファクト テーブルに追加されます。

ここに画像の説明を入力

次に、指標 2 と 3 についても同様です。他に質問がある場合は、同様に続けます。

値を持つ各フィールドは、単一の行になります。もちろん、 and のように追加するメタデータは他にもありますload_dtrecord_src、それらは問題ではありません。

現在のスクリプトは次のことを行っています。

  1. フィールドを配列に取得 =>fields_array = ['indicator_1', 'indicator_2', 'indicator_3']

  2. 配列に対してループが実行され、各行の値を含む各フィールドの追加が開始されます。100 行あるとします。一度に 1 つずつ、300 の挿入を実行します。

    for (var col_num = 0; col_num<fields_array.length; col_num = col_num+1) {

        var COL_NAME = fields_array[col_num];
    
        var field_value_query = "INSERT INTO SAT_FIELD_VALUE SELECT md5(id), CURRENT_TIMESTAMP(), NULL, 'SRC', "+COL_NAME+", md5(foreign_key_field) FROM "+TEMP_TABLE_NAME+"";
    

    }

完全なスクリプトを示すこの投稿のコメントで述べたように、各from values挿入クエリを連結する文字列をループすることをお勧めします。

提案された解決策には 2 つの問題があります。

  1. Snowflake にはクエリのサイズ制限があります (1 MB 未満にする必要があります)。
  2. 各フィールドをループして を連結するfrom values場合はselect、一時テーブルからもクエリを実行して列の値を取得する必要があるため、最適化は行われません。または、時間を少し短縮しますが、そうではありません。過ぎる。

編集:可能な解決策

一時テーブルからすべてを選択するSQLクエリを実行し、ハッシュとすべてを実行して、転置後に配列に保存することを考えていましたが、その方法がわかりません。

4

2 に答える 2

1

INSERT ALLを使用するのは素晴らしいシナリオです:

INSERT ALL
INTO dst_tab(hash_key, md5) VALUES (indicator_1, md5)
INTO dst_tab(hash_key, md5) VALUES (indicator_2, md5)
INTO dst_tab(hash_key, md5) VALUES (indicator_3, md5) 
SELECT MD5(id) AS md5, indicator_1, indicator_2::STRING AS indicator_2, indicator_3 
FROM src_tab;
于 2021-04-03T12:29:39.563 に答える