Неожиданные 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, чтобы показать результаты производя и получить представление о том, какую информацию они получают из базы данных
Я получал эти запросы при использовании Квартиры для multitenancy со схемами Postgres. По-видимому, каждый excluded_model-модель, использующая схему по умолчанию-генерировал один запрос "pg_class" в каждом запросе.
ребята из квартиры исправили его в версии 0.25.0.
генерируются ли запросы из пользовательского ввода в вашем приложении? если это так, если у вас нет элементов управления пользовательским вводом, то, возможно, это SQL-инъекция от кого-то, кто пытается взломать ваше приложение.
http://en.wikipedia.org/wiki/SQL_injection
Я не очень хорошо знаком с rails, поэтому я не знаю, автоматически ли он создал запросы, о которых вы, как разработчик, не знаете, но я бы так не думал.