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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

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

Ruby on Rails

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

Q&A

解決済

2回答

1292閲覧

sqlの複数発行について

YamauchiSadaka

総合スコア10

SQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/06 14:17

編集2020/08/06 15:01

いつもお世話になってます。
今回もどうぞよろしくお願いします。

sqlが複数回発行されているか

  • 以下のコードにおいて、↓のslimの3行を指して上司から「sqlが表示部分と合わせて2回発行されているのではないか。1回で済ませられるようにしましょう」とレビューを受けました。(Railsです)

controller

1@reservations = Reservation.where(date: Date.current)

slim

1- if current_user.admin? || current_user.adviser? 2 - if @reservations.exists? 3 = render "reservations", reservations: @reservations

試した事

  • exists?を消して、sqlが発行されないようにしてみましたが、それだとif @reservationsが毎回trueになってしまい、望む挙動になりません。
  • 以下のように、pを打って出力を確認した所、---5------6---の間には

Reservation Exists? (0.3ms) SELECT 1 AS one FROM "reservations" WHERE "reservations"."date" = $1 LIMIT $2 [["date", "2020-08-06"], ["LIMIT", 1]]
が出力されましたが、

---1------2---の間には何も出力されないので、2回発行されていないと自分は考えています。

ruby

1p "---1---" 2@reservations = Reservation.where(date: Date.current) 3p "---2---" 4 5= p "---4---" 6- if current_user.admin? || current_user.adviser? 7= p "---5---" 8- if @reservations.exists? 9= p "---6---" 10= render "reservations", reservations: @reservations 11= p "---7---"

ですが、この確認方法が合っているかは自信がありません。

上司からは「DBからデータを取ってきて、rubyでデータがあるかどうかのチェックし、データを表示すればSQL発行は1回で済む」と追加でアドバイスがありました(原文ママ)。

これの意味をずっと考えていますが、まだ分かりません。
whereはActiveRecord::RelationなのでSQLの発行はしていないと思うのですが、、

どうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

mingos さんの言われる通り、log に SELECT が一回しかなければ1回です。
ただし、

---1------2---の間には何も出力されないので、2回発行されていないと自分は考えています。

は間違いです。
@reservations = Reservation.where(date: Date.current)
は DBにアクセスに行くことは指示していません。「アクセスするときにはこういう条件で」という ActiveRecord_Relation を定義しているだけです。
その後の @reservations.exists?@reservations.count や @reservations.each などDBにアクセスしないと結果が得られないmethodが来て初めて SELECT が発行されます。

ですので、載っているcodeの範囲では では 5,6の間だけではなく、6,7の間でもSELECTしているのではないか、と思いますが、どうでしょう。

exist?のアクセスは軽いから、有っても良いだろうと思うのですが、、、
でないとすると、
@reservations = @reservations.to_a if @reservations.present?
などとしなくてはならなくなります。

投稿2020/08/06 22:36

winterboum

総合スコア23284

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

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

YamauchiSadaka

2020/08/07 07:55 編集

なるほど、ActiveRecord::Relationをarrayにしてしまえばsqlは1回のみ実行ですね、、確かに render "reservations", reservations: @reservations の先でeachが回っています。 上司からは以下の2行を特に強調して指摘されたのでスルーしてました。 - if current_user.admin? || current_user.adviser? - if @reservations.exists? ありがとうございます。
guest

0

「推測するな、計測せよ」という格言があります。
まずは、SQLが実際に何回発行されているかを確認してください。
ターミナルで以下を実行しつつ、
tail -f log/development.log | grep SELECT
ブラウザで該当ページにアクセスします。
ターミナルでSELECT文が何回実行されているのか分かります。
それでSQLの回数が問題なければ、上司にそれを見せれば良いだけです。

もし2回発行されているなら、それから改善策を考えても良いと思いますよ。

投稿2020/08/06 14:26

mingos

総合スコア4025

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

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

YamauchiSadaka

2020/08/06 14:57

コメントありがとうございます。 すいません、大事な事を書いていませんでした。 以下のようにして確認したんですが、`---5---`と`---6---`の間には `Reservation Exists? (0.3ms) SELECT 1 AS one FROM "reservations" WHERE "reservations"."date" = $1 LIMIT $2 [["date", "2020-08-06"], ["LIMIT", 1]]` が出力されましたが、 `---1---`と`---2---`の間には何も出力されないので、2回発行されていないと自分は考えています。 ```ruby p "---1---" @reservations = Reservation.where(date: Date.current) p "---2---" = p "---4---" - if current_user.admin? || current_user.adviser? = p "---5---" - if @reservations.exists? = p "---6---" = render "reservations", reservations: @reservations = p "---7---" ``` 頂いたコマンドももう一度試して、もう少し調べてみようと思います。
mingos

2020/08/06 15:00

ログに該当のSELECTが1回しか出てこないのであれば、それでOKです。 動かぬ証拠ですからそれを上司に見せれば良いと考えてます。 SQLが複数実行される可能性があると上司はコードを見て言ったわけですが、 実際に動作を確認したらそうではないので、コードを修正する必要はないと主張できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問