Использование хранимых процедур в Rails - PullRequest
8 голосов
/ 23 декабря 2009

Как я уже говорил в предыдущем посте, наше приложение Rails должно взаимодействовать с таблицей типа E-A-V в стороннем приложении, из которого мы получаем данные. Я создал View, чтобы сделать данные нормальными, но это занимает слишком много времени для запуска. Один из наших оффшорных разработчиков PHP создал хранимую процедуру, чтобы ускорить ее.

Теперь мы столкнулись с проблемой, которая нам необходима для вызова этой хранимой процедуры из приложения Rails, а также для обеспечения поиска и фильтрации. Представление могло сделать это, потому что Rails рассматривал это как традиционную модель Rails. Как я могу сделать это с сохраненным процессом? Нужно ли нам писать пользовательский поиск и заказ (мы использовали Searchlogic)? Управление не в состоянии понять недостатки использования хранимых процедур от Rails; все, что они говорят, это то, что текущий метод загружает данные слишком долго и требует исправления, но поиск и фильтрация являются критическими функциями.

РЕДАКТИРОВАТЬ Я разместил код для этого запроса здесь: Оптимизация странного MySQL Query . Забавно, что когда я запускаю этот запрос в графическом интерфейсе (Navicat), он выполняется примерно за 5 секунд, но на веб-странице он занимает больше минуты; представление сложное по причинам, которые я обрисовал в первоначальном посте, но я бы подумал, что MySQL оптимизирует и кэширует представления, как это делает SQL Server (или, скорее, то, как я читаю то, что делает SQL Server), чтобы повысить производительность.

1 Ответ

5 голосов
/ 23 декабря 2009

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

Оглядываясь на ваш последний вопрос, я бы попросил администратора баз данных создать триггер для создания более реляционной структуры из данных. Триггер вставляет данные EVA в таблицу, и это единственный известный мне способ выполнения материализованных представлений в MySQL. Таким образом, вы вносите небольшую дополнительную фоновую стоимость при вставке, и приложение может работать нормально.

В любом случае ...

ActiveRecord::Base.connection.execute("call SP_name (#{param1}, #{param2}, ... )")

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

...