2009-12-23 1 views
8

Come ho detto in un post precedente, la nostra app Rails deve interfacciarsi con un tipo di tabella E-A-V in un'applicazione di terze parti da cui stiamo tracciando i dati. Avevo creato una vista per rendere normali i dati, ma è troppo lungo per essere eseguito. Abbiamo avuto uno dei nostri sviluppatori PHP in mare aperto per creare una stored procedure per velocizzarla.Utilizzo di stored procedure in Rails

Ora ci siamo imbattuti nel problema che dobbiamo chiamare questa stored procedure dall'app Rails, oltre a fornire ricerca e filtro. La vista poteva farlo perché Rails lo trattava come un modello tradizionale di Rails. Come posso fare questo con il proc memorizzato? Avremmo bisogno di scrivere ricerche e ordini personalizzati (stavamo usando Searchlogic)? La gestione non è in grado di comprendere gli svantaggi dell'utilizzo di un proc memorizzato da Rails; tutto quello che dicono è che il metodo attuale impiega troppo tempo per caricare i dati e deve essere corretto, ma la ricerca e il filtro sono funzioni critiche.

EDIT Ho inserito il codice per questa query qui: Optimizing a strange MySQL Query. Quello che è divertente è che quando eseguo questa query in una GUI (Navicat) viene eseguito in circa 5 secondi, ma sulla pagina web ci vuole più di un minuto per essere eseguito; la vista è complicata per i motivi che ho delineato nel post originale, ma penso che MySQL ottimizzi e memorizzi nella cache le visualizzazioni come fa SQL Server (o meglio, come leggo quello che fa SQL Server) per migliorare le prestazioni.

+2

L'utilizzo della stored procedure con Rails suona male ... Non riesci a trovare un altro modo per migliorare i tempi di caricamento? – marcgg

+0

Accetto con marcgg ... potresti fornire informazioni in modo che potessimo pensare ad altri modi per migliorare le prestazioni? – Ben

+0

Concordo sul fatto che questa situazione particolare sembri malvagia, tuttavia questa è una buona domanda, in quanto non si ha sempre il controllo del database. – jamesaharvey

risposta

4

È possibile chiamare stored procedure da Rails, ma si perderanno la maggior parte dei vantaggi di ActiveRecord, poiché lo standard SQL generato non funzionerà. È possibile utilizzare la connessione al database nativo e chiamarla, ma sarà un'astrazione che perde. Si consiglia di prendere in considerazione DataMapper.

Ripensando all'ultima domanda, vorrei che il DBA creasse un trigger per creare una struttura più relazionale dai dati. L'innesco dovrebbe inserire i dati EVA in una tabella, che è l'unico modo che conosco per fare visioni materializzate in MySQL. In questo modo si paga solo un piccolo costo di background incrementale sull'inserto e l'applicazione può essere eseguita normalmente.

Comunque ...

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

Ma c'è un open ticket out there on lighthouse indica tale approccio non può funzionare senza modificare alcuni dei parametri da utilizzare la connessione.