VIEW
まず、この機能を提供するを作成できます。
CREATE VIEW orders AS
SELECT '1'::int AS source -- or any other tag to identify source
,"OrderNumber"::text AS order_nr
,"InvoiceNumber" AS tansaction_id -- no cast .. is int already
,"OrderDate" AT TIME ZONE 'UTC' AS purchase_date -- !! see explanation
FROM tbl_newegg
UNION ALL -- not UNION!
SELECT 2
"amazonOrderId"
,"merchant-order-id"
,"purchase-date"
FROM tbl_amazon;
このビューは、他のテーブルと同じようにクエリできます。
SELECT * FROM orders WHERE order_nr = 123 AND source = 2;
が一意でない場合はsource
が必要です。order_nr
異なるソースで一意の注文番号を保証するには、他にどのような方法がありますか?
Atimestamp without time zone
は、グローバル コンテキストではあいまいです。タイムゾーンに関連してのみ有効です。timestamp
とを混在させる場合、これを機能させるには、 を特定のタイム ゾーンtimestamptz
に配置する必要があります。詳細については、この関連する回答をお読みください。timestamp
AT TIME ZONE
私はタイムゾーンとして UTC を使用していますが、別のタイムゾーンを提供することをお勧めします。単純なキャスト"OrderDate"::timestamptz
では、現在のタイム ゾーンが想定されます。の結果にAT TIME ZONE
適用されます。そのため、別のキャストを追加しませんでした。timestamp
timestamptz
可能ですが、PostgreSQL でキャメルケースの識別子を使用しないことをお勧めします。考えられるさまざまな混乱を回避します。私が提供した小文字の識別子 (不要になった二重引用符なし) に注意してください。
varchar(25)
の型として使用しないでくださいorder_nr
。text
文字列でなければならない場合は、任意の長さ修飾子なしで使用してください。すべての注文番号が数字だけで構成されている場合、integer
またはbigint
より高速になります。
パフォーマンス
これを高速化する 1 つの方法は、ビューを具体化することです。つまり、結果を (一時) テーブルに書き込みます。
CREATE TEMP TABLE tmp_orders AS
SELECT * FROM orders;
ANALYZE tmp_orders; -- temp tables are not auto-analyzed!
ALTER TABLE tmp_orders
ADD constraint orders_pk PRIMARY KEY (order_nr, source);
インデックスが必要です。私の例では、主キー制約によってインデックスが自動的に提供されます。
テーブルが大きい場合は、一時テーブルを作成する前に、RAM でこれを処理するのに十分な一時バッファーがあることを確認してください。そうしないと、実際に速度が低下します。
SET temp_buffers = 1000MB;
セッション内の一時オブジェクトへの最初の呼び出しである必要があります。セッションのためだけに、グローバルに高く設定しないでください。とにかく、セッションの最後に一時テーブルが自動的に削除されます。
必要な RAM の量を見積もるには、テーブルを一度作成して測定します。
SELECT pg_size_pretty(pg_total_relation_size('tmp_orders'));
dba.SE に関するこの関連する質問の下のオブジェクト サイズの詳細。
1 つのセッション内で多数のクエリを処理する必要がある場合にのみ、すべてのオーバーヘッドが発生します。他のユースケースについては、他のソリューションがあります。クエリの時点でソース テーブルがわかっている場合は、代わりにソース テーブルにクエリを送信する方がはるかに高速です。そうでなければ、あなたのユニークさをorder_nr
もう一度疑うでしょう。実際、一意であることが保証されている場合は、source
導入した列を削除できます。
クエリが 1 つまたは少数の場合は、具体化されたビューではなくビューを使用する方が高速な場合があります。
また、レコードが見つかるまでテーブルを次々とクエリするplpgsql 関数も検討します。オーバーヘッドを考慮すると、いくつかのクエリの方が安いかもしれません。もちろん、必要なすべてのテーブルのインデックス。
text
また、またはに固執する場合は、それを検討してvarchar
ください。order_nr
COLLATE "C"