0

MERGEVertica データベースにステートメントを書きたいと思います。直接使用できないことはわかっています。目的の効果を得るには、挿入/更新を組み合わせる必要があります。

マージ文は次のようになります。

MERGE INTO table c USING (select b.field1,field2 aeg from table  a, table  b
where a.field3='Y' 
and a.field4=b.field4
group by  b.field1) t
  on (c.field1=t.field1)
    WHEN MATCHED THEN
      UPDATE 
        set c.UUS_NAIT=t.field2;

挿入/更新として使用されているMERGEの例を見たいだけです。

4

4 に答える 4

4

Vertica で更新を行いたくありません。挿入は問題ありません。選択は問題ありません。ただし、更新または削除するものには近づかないことを強くお勧めします。

このシステムは、大量のデータを読み取り、大量のデータを挿入するために最適化されています。したがって、2 つのうちの 1 つを実行する操作を実行したいので、私はそれをお勧めしません。

あなたが述べたように、ステートメントを挿入と更新に分けることができます。

あなたがやりたいことの詳細がわからないので、これは変更される可能性があります。

1) 外部ソースからのデータをステージング テーブルに挿入します。
2)考えている基準を使用して、そのテーブルから目的のテーブルにINSERT-SELECTを実行します。結合を使用するか、テストするテーブルへのサブクエリを含む 2 つのステートメントを使用します。
3) ステージング テーブルを切り捨てます。

複雑に思えますが、実際には UPDATE を実行したくありません。それが面倒だと思う場合は、面倒の原因が SELECT ステートメントで得られるものであることを覚えておいてください。

于 2012-05-18T04:14:51.020 に答える
3

MERGEステートメントの例が必要な場合は、リンクをたどってください。これは、Vertica のドキュメントへのリンクです。明確に指示に従うことを忘れないでください。WHEN NOT MATCHED続いて andを使用して Merge を作成することはできませんWHEN MATCHED。ドキュメントの使用方法の説明に示されている順序に従う必要があります (これは逆です)。ただし、1 つを完全に省略することもできます。

Vertica では、更新または削除されたデータが実際にはテーブルから削除されず、「削除済み」としてマークされるだけであるという事実を認識している場合、わかりません。この種のデータは、 SELECT PURGE_TABLE('schemaName.tableName');を実行して手動で削除できます。

そのスキーマでこれを行うには、スーパー ユーザー権限が必要になる場合があります。詳細については、Vertica のドキュメントを参照してください。データをパージします。Vertica の Web サイトからのこの例: MERGE を使用した更新と挿入の同時実行

Merge が Vertica バージョン 6.0 でサポートされていることに同意します。ただし、Vertica の AHM またはエポック管理設定が大量の履歴 (削除済み) データを保存するように設定されている場合、更新が遅くなります。更新速度は、悪いものから、さらに悪いもの、恐ろしいものへと変化する可能性があります。

削除された(古い)データを取り除くために私が通常行うことは、テーブルを更新した後にテーブルでパージを実行することです。これにより、更新速度を維持することができました。Merge は、確実に更新を実行する必要がある場合に役立ちます。特に、何百万もの行を更新する可能性のある毎日の増分更新。

あなたの答えにたどり着く: Vertica は Merge で Subquery をサポートしていないと思います。次のようになります。

ERROR 0:  Subquery in MERGE is not supported

同様のユースケースがあったとき、サブクエリを使用してビューを作成し、新しく作成したビューをソース テーブルとして使用して宛先テーブルにマージしました。これにより、Vertica で MERGE 操作を使用し続けることができ、通常の PURGE により更新を高速に保つことができます。

実際、マージは、理想的には主キーの結合である必要がある ON 句でフィールドの正しい組み合わせを使用する場合、挿入または更新中の重複エントリを回避するのにも役立ちます。

于 2013-04-09T17:50:44.410 に答える
2

一般的にジェフの答えが好きです。直感に反するように思えますが、既存のテーブルを変更するよりも、必要な行を含む新しいテーブルを作成する方が良い結果が得られます。

そうは言っても、そうする価値があるのは、テーブルが特定のサイズを超えた場合、または特定の数の UPDATE を超えた場合だけです。100万行未満のテーブルについて話している場合は、チャンスをつかんでその場で更新を行い、廃棄された行を削除するためにパージします。

于 2012-05-18T06:36:22.277 に答える
0

明確にするために言うと、Vertica は単一行の更新にはあまり適していませんが、大規模な一括更新はそれほど問題になりません。テーブル全体を再作成することはお勧めしません。パーティションの再作成またはステージング テーブルからの一括更新に関する戦略を検討します。

于 2012-05-18T16:07:41.827 に答える