2009-12-23 8 views
8

이전 게시물에서 말했듯이 Rails 응용 프로그램은 데이터를 가져 오는 타사 응용 프로그램에서 E-A-V 유형의 테이블과 인터페이스해야합니다. 데이터를 정상적으로 만들기 위해 뷰를 만들었지 만 너무 오래 실행됩니다. 우리는 오프 쇼어 PHP 개발자 중 한 명이 속도를 높이기 위해 저장 프로 시저를 만들었습니다.레일에서 저장 프로 시저 사용

이제 Rails 앱에서이 저장 프로 시저를 호출하고 검색 및 필터링을 제공해야한다는 문제가 있습니다. Rails가이를 전통적인 Rails 모델로 취급했기 때문에 뷰가이를 수행 할 수있었습니다. 저장 프로 시저로 어떻게이 작업을 수행 할 수 있습니까? 맞춤 검색 및 주문 (Searchlogic을 사용하고 있습니다)을 작성해야합니까? 관리는 Rails에서 저장된 proc를 사용하는 단점을 이해할 수 없습니다. 현재의 방법은 데이터를로드하는 데 너무 오래 걸리므로 고정해야하지만 검색 및 필터링은 중요한 기능입니다.

편집 여기에이 코드의 코드를 게시했습니다 : Optimizing a strange MySQL Query. 재미있는 점은 GUI (Navicat)에서이 쿼리를 실행하면 약 5 초 만에 실행되지만 웹 페이지에서는 실행하는 데 1 분 이상 걸립니다. 뷰는 원래 게시물에서 개괄하는 이유 때문에 복잡하지만, MySQL이 성능을 향상시키기 위해 SQL Server와 같은 뷰를 최적화하고 캐싱한다고 생각할 것입니다.

+2

Rails에서 저장 프로 시저를 사용하면 악의적 인 소리가납니다 ... 로딩 시간을 개선 할 수있는 다른 방법을 찾을 수 없습니까? – marcgg

+0

marcgg와 동의하십시오 ... 성능 향상을위한 다른 방법을 생각할 수 있도록 정보를 제공해 주시겠습니까? – Ben

+0

나는이 특별한 상황이 악의로 들린다는 것에 동의하지만, 이것은 좋은 질문이다. 데이터베이스에 대한 통제권이 항상있는 것은 아니기 때문이다. – jamesaharvey

답변

4

레일스에서 ​​저장 프로 시저를 호출 할 수 있지만 표준 생성 SQL은 작동하지 않으므로 ActiveRecord의 장점 대부분을 잃게됩니다. 네이티브 데이터베이스 연결을 사용하여 호출 할 수 있지만, 그것이 새는 추상화가 될 것입니다. DataMapper를 고려할 수 있습니다.

마지막 질문을 되돌아 보면 DBA가 데이터에서 더 많은 관계형 구조를 만들 수있는 방아쇠를 만들 수 있습니다. 트리거는 EVA 데이터를 테이블에 삽입합니다. MySQL에서 구체화 된 뷰를 수행하는 유일한 방법입니다. 이 방법을 사용하면 삽입시 약간의 증분 백그라운드 비용 만 지불하고 응용 프로그램을 정상적으로 실행할 수 있습니다. 어쨌든

...

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

는 그러나 밖으로 연결을 사용하는 일부 매개 변수를 변경 작동하지 않을 수 있습니다이 방법을 나타내는 open ticket out there on lighthouse있다.