質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

825閲覧

ruby on rails 複数回走るSQLを早くする方法

hiepita1

総合スコア37

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/11/27 12:21

お世話になっております。
ruby on railsで、postgresqlに対する効率の良いinsert方法を教えて頂きたいです。
特定の条件によって、一時テーブルから一時テーブルにselect insertするようなコードを書いています。
一つ一つのselect insertは早いのですが、何万回とこの処理を走るので、とても時間がかかっています。
処理時間を減らす良い方法はないでしょうか?

tmp_table_A = get_tmp_table_A for 1...100000 if 条件1  ActiveRecord::Base.connection.execute("INSERT INTO tmp_table_B  (  col1,col2,col3)  SELECT  col1,col2,col3  FROM  tmp_table_A  WHERE  条件1  ")  elsif 条件2  ActiveRecord::Base.connection.execute("INSERT INTO tmp_table_B  (  col1,col2,col3)  SELECT  col1,col2,col3  FROM  tmp_table_A  WHERE  条件2  ")  elsif 条件3  ActiveRecord::Base.connection.execute("INSERT INTO tmp_table_B  (  col1,col2,col3)  SELECT  col1,col2,col3  FROM  tmp_table_A  WHERE  条件2  ") ...以降条件がいくつも続く end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1.一定件数でcommitする

 大量データになるとアーカイブログも増加しパフォーマンスがだんだん劣化します。
commitすることで、これらが解放されパフォーマンスが安定します。
※特に2.での条件にこれらのトランザクションが含まれているような場合には、顕著になります。

※一時テーブルということなので、自ずとトランザクション件数を分割して処理することと同じ意味になります。

2.INSERTの発行回数を減らす

insert into テーブル (select ~
で行っているので、条件を工夫すれば、一度に複数行の処理が行えますよね。

※1.を合わせて行う場合を考えて2.での処理は行数で範囲が絞れるような条件である方が良いでしょう。

3.一時テーブルにインデックスを作成する。

一時テーブルとは言え、実行計画を確認して適切なインデックスを作成すると劇的に早くなる場合があります。

投稿2017/11/27 14:51

編集2017/12/14 08:31
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiepita1

2017/12/07 12:31

今回は1トランザクション内で完結したい処理のため、2と3で対応することにしました。 ありがとうございます。
guest

0

SQLは実行する回数が少ない程処理時間は短いですから、DELETE, INSERT, SELECT, UPDATEなどの処理をなるべく複数行をまとめて実行できたり、テーブルの全件走査を避けるためにWHEREでの条件にみあう索引を適切に設定されているかがパフォーマンスに大きく影響します。
1回SQLを実行すれば良いのに LOOPの中で何億回も実行しているSQLがあるERPに出会ったこともあります。

質問の条件やCREATE TABLE, CREATE INDEX, 各テーブルのレコード件数を提示できると解決が早いかもしれません。

投稿2017/11/27 12:38

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiepita1

2017/12/07 12:33

ありがとうございます。 まさに現在のコードがご指摘のあったようなコードになっています・・・ 分岐処理等を見直した上で、再度ご質問させてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問