Использование хранимых процедур в Rails

8

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

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

EDIT Я разместил здесь код для этого запроса: Оптимизация странного MySQL-запроса. Смешно, что когда я запускаю этот запрос в графическом интерфейсе (Navicat), он запускается примерно через 5 секунд, но на веб-странице требуется более минуты; представление сложное по причинам, изложенным в исходном сообщении, но я бы подумал, что MySQL оптимизирует и кэширует такие представления, как SQL Server (или, вернее, как я читаю этот SQL Server), для повышения производительности.

  • 2
    Использование хранимых процедур с Rails звучит плохо ... Не можете ли вы найти другой способ улучшить время загрузки?
  • 0
    Согласитесь с marcgg ... не могли бы вы предоставить информацию, чтобы мы могли подумать о других способах повышения производительности?
Показать ещё 4 комментария
Теги:
stored-procedures

1 ответ

4
Лучший ответ

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню