Неожиданные SQL-запросы к базе данных Postgres на Rails/Heroku

я нырял в очень длинный запрос к одному из моих приложений Rails с помощью NewRelic и нашел ряд 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))

...и...

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 раз, принимая 145ms и 135ms (соответственно) всего.

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

...был выполняется 2 раза по стоимости 104ms, и...

SHOW search_path

...командовал 45ms в одном вызове.

моя кишка говорит, что они связаны с адаптером Postgres Rails, но я не понимаю, что их запускает или что они делают, или (что более важно), почему они выстрелили во время типичного запроса.


Я просто проверил журналы более тщательно, и похоже, что Dyno, на котором этот запрос выполнялся, был переведен на "вверх" всего за несколько секунд до этого, так что это вероятно, эта просьба была первой.

4 ответов


таблицы pg_class, pg_attribute, pg_depend и т. д. описывают таблицу, столбцы и зависимости в postgres. В Rails классы моделей определяются таблицами, поэтому Rails считывает таблицы и столбцы, чтобы выяснить атрибуты для каждой модели.

в режиме разработки он ищет эти значения каждый раз, когда модель доступна, поэтому, если вы сделали последнее изменение, Rails знает об этом. В производственном режиме Rails кэширует это, чтобы вы видели их гораздо реже, и поэтому это действительно не проблема.


эти запросы используются для получения "определения" ваших таблиц и полей и, вероятно, используются платформой для автоматического создания моделей и/или правил проверки в Ruby. (Например. "Интроспекция")

Я не есть опыт работы с Ruby и фреймворком, который вы используете, но я не ожидаю, что эти запросы будут исходить из SQL-инъекции.

вы можете запустить запросы самостоятельно в pgAdmin или psql, чтобы показать результаты производя и получить представление о том, какую информацию они получают из базы данных



генерируются ли запросы из пользовательского ввода в вашем приложении? если это так, если у вас нет элементов управления пользовательским вводом, то, возможно, это SQL-инъекция от кого-то, кто пытается взломать ваше приложение.

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

Я не очень хорошо знаком с rails, поэтому я не знаю, автоматически ли он создал запросы, о которых вы, как разработчик, не знаете, но я бы так не думал.