2017-08-24 9 views
3

私はdplyrdbplyrパッケージを使用してデータベースとのインターフェイスをとっています。私は何百万という記録を持つテーブルを持っています。私はまた、私がフィルタリングしたい同じテーブルのキーに対応する値のリストを持っています。通常、私はこのようなことをしてテーブルをフィルタリングします。多数の一致を含むdplyrフィルタデータベーステーブル

library(ROracle) 

# connect info omitted 
con <- dbConnect(...) 

# df with values - my_values 

con %>% tbl('MY_TABLE') %>% filter(FIELD %in% my_values$FIELD) 

しかし、そのmy_valuesオブジェクトは、500K以上のエントリを(それゆえ、なぜ私はここに実際のデータを提供していません)が含まれています。これは、基本的にINステートメントに入れられていると、明らかに効率的ではありません(本質的にハングします)。通常、私がSQLを書いていたのであれば、一時テーブルを作成してWHERE EXISTS節を書くでしょう。しかし、この例では、書き込み権限がありません。

このクエリをRでより効率的にするにはどうすればよいですか?

+0

おそらく、内部結合ですか? – rsmith54

答えて

0

これが役立つかどうかを確認してくださいますが、いくつかの提案:

  1. は、フィルタリングのための他の基準を検索します。たとえば、my_values$FIELDが連続している場合や、値のリストが他の列で推測できる場合は、betweenフィルタ(filter(between(FIELD, a, b)))からヘルプを探すことができます。
  2. 分裂と征服。 my_valuesを小さなバッチに分割し、各バッチに対してクエリを行い、結果を結合します。これはしばらく時間がかかるかもしれませんが、安定していて待つ価値があります。あなたの制約を見て
+0

回答ありがとうございます、残念ながら、値は連続していないので、オプション1は外です。オプション2は動作するはずですが、私はここで他の可能性を期待しています。 – cdeterman

0

、私はPolorビールが提案方法に似て、それに近づくだろうが、私はpurrr::mapを使用して値ごとに1デシベルコマンドを送信した後、最後にdplyr::bindrows()を使用します。このようにして、あなたのリストが変更された場合に適応する素敵なパイプコードが得られます。理想的ではありませんが、SQLテーブル変数を手作業で書くのであれば、他の解決方法はわかりません。

関連する問題