私はR.COPYを使用してRを介して100万行以上のINSERTをPostgresに高速化しますか?
query <- sprintf("BEGIN;
CREATE TEMPORARY TABLE
md_updates(ts_key varchar, meta_data hstore) ON COMMIT DROP;
INSERT INTO md_updates(ts_key, meta_data) VALUES %s;
LOCK TABLE %s.meta_data_unlocalized IN EXCLUSIVE MODE;
UPDATE %s.meta_data_unlocalized
SET meta_data = md_updates.meta_data
FROM md_updates
WHERE md_updates.ts_key = %s.meta_data_unlocalized.ts_key;
COMMIT;", md_values, schema, schema, schema, schema)
DBI::dbGetQuery(con,query)
に全体を使用して複数行のINSERT文字列を用意しており、そうするために、バルクINSERT/UPSERT行の適度に多量にRを使用して、PostgreSQLデータベースにしたいと思い関数はhereです。驚いたことに(私にはちょっと離れて)私はUPDATEの部分が問題ではないことを学びました。私はそれを残して再度クエリを実行し、それほど速くはなかった。 INSERT 100万レコードがここで問題になっているようです。
私はいくつかの研究を行なったし、かなりの情報が見つかりました:@Erwin Brandstetterと@Craigリンガーから
what causes large inserts to slow down
答えは特に有用でした。インデックスを落としたり、いくつかの提案をしたりすることで、私はかなりスピードアップできました。
しかし、私は有望と思われる別の提案を実装するのに苦労しました:COPY
。
sql <- sprintf('CREATE TABLE
md_updates(ts_key varchar, meta_data hstore);
COPY md_updates FROM STDIN;')
dbGetQuery(sandbox,"COPY md_updates FROM 'test.csv' DELIMITER ';' CSV;")
しかし、私はそれは、余分な.csvファイルから読み込むことなく成し遂げることはできません。問題は、私はそれが私のために 次作品
R.
内から成し遂げることはできないです。だから、私の質問は以下のとおりです。は本当に私が得た複数行INSERTこっちの有望なアプローチ(
COPY
ですファイルにデータを書き込むことなく、Rの中から
COPY
を使用する方法はありますか? 。データがメモリにフィットし、それはMEMですでにだから、なぜディスクに書き込む?
私は、それぞれOS XおよびRHEL 9.5でPostgreSQL 9.5を使用しています。
と同じ列を持っている
それはRにあることがありますか? Rは 'psql'を呼び出せますか?そうであれば、 '\ COPY'(' COPY'ではなく)を使います。 –
@Neil McGuiganはい、Rにする必要があります.Rはあらゆる種類のシステムコールを行うことができるので、psqlはオプションですが、これはパッケージの一部であり、私はpsqlに頼っていません。まだ内部のRソリューションを探しています。 –
EricからErwinを元に戻してください - それは変わっています –