15

私は NewRelic を使用して自分の Rails アプリケーションの 1 つに非常に長いリクエストを行っていましたが、かなりの時間を費やしている、まったく無関係に見える多数の SQL クエリを見つけました。私はグーグルで検索しましたが、それらが何であるかについては手ぶらで出てきました。ましてや、それらの発生を防ぐことができるかどうかは言うまでもありません.

SELECT COUNT(*) FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind in (?, ?) AND c.relname = ? AND n.nspname = ANY (current_schemas(false))

…そして…</p>

SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = ?::regclass AND a.attnum > ? AND NOT a.attisdropped ORDER BY a.attnum

…それぞれが 7 回発生し、合計で 145 ミリ秒と 135 ミリ秒かかりました。

SELECT DISTINCT(attr.attname) FROM pg_attribute attr INNER JOIN pg_depend dep ON attr.attrelid = dep.refobjid AND attr.attnum = dep.refobjsubid INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[?] WHERE cons.contype = ? AND dep.refobjid = ?::regclass

…104 ミリ秒のコストで 2 回実行され、…</p>

SHOW search_path

…1 回の呼び出しで 45 ミリ秒を命令しました。

私の直感では、これらは Postgres Rails アダプターに関連していると言われていますが、何がそれらをトリガーするのか、何をしているのか、または (より重要なことに) 典型的なリクエスト中になぜそれらが起動したのか理解できません。


ログをさらに詳しく調べたところ、このリクエストが実行された Dyno がほんの数秒前に「アップ」に遷移したようです。このリクエストが最初のリクエストだった可能性があります。

4

4 に答える 4

10

テーブル pg_class、pg_attribute、pg_depend などはすべて、postgres のテーブル、列、および依存関係を記述します。Rails では、モデル クラスはテーブルによって定義されるため、Rails はテーブルと列を読み取り、各モデルの属性を把握します。

開発モードでは、モデルがアクセスされるたびにこれらの値を検索するため、最近変更を行った場合、Rails はそれを認識します。プロダクション モードでは、Rails がこれをキャッシュするので、これらが表示される頻度ははるかに低くなるため、実際には問題になりません。

于 2013-02-04T19:59:52.747 に答える
3

これらのクエリは、テーブルとフィールドの「定義」を取得するために使用され、Ruby でモデルや検証ルールを自動的に生成するために使用しているフレームワークによっておそらく使用されます。(例:「内省」)

Ruby とあなたが使用しているフレームワークの経験はありませんが、これらのクエリが SQL インジェクションから発生するとは思いません

pgAdmin または psql でクエリを自分で実行して、生成されている結果を表示し、データベースから取得した情報を把握できます。

于 2013-02-04T19:59:14.120 に答える
0

PostgresスキーマでマルチテナンシーにApartment Gemを使用しているときに、これらのクエリを取得していました。明らかに、各 exclude_model (デフォルトのスキーマを使用するモデル) は、すべてのリクエストで 1 つの「pg_class」クエリを生成していました。

Apartment の担当者がバージョン 0.25.0 で修正しました。

于 2014-07-20T15:12:16.570 に答える
-5

アプリケーションのユーザー入力からクエリが生成されますか?もしそうなら、ユーザー入力を制御できない場合は、アプリをハッキングしようとしている誰かからのSQLインジェクションである可能性があります。

http://en.wikipedia.org/wiki/SQL_injection

私はレールにあまり詳しくないので、開発者が知らないクエリが自動的に作成されたかどうかはわかりませんが、そうは思いません。

于 2013-02-04T19:55:08.787 に答える