2009-12-23 23 views
8

Wie ich bereits in einem früheren Post gesagt habe, muss unsere Rails-App mit einer E-A-V-Tabelle in einer Drittanbieter-Anwendung verbunden sein, von der wir Daten beziehen. Ich hatte eine Ansicht erstellt, um die Daten normal zu machen, aber es dauert viel zu lange, um ausgeführt zu werden. Wir haben einen unserer Offshore-PHP-Entwickler eine gespeicherte Prozedur erstellen lassen, um die Geschwindigkeit zu erhöhen.Gespeicherte Prozeduren in Rails verwenden

Jetzt kommen wir auf das Problem, dass wir diese gespeicherte Prozedur von der Rails App aufrufen müssen, und bieten Suche und Filterung. Die Ansicht könnte dies tun, weil Rails es als ein traditionelles Rails-Modell behandelt hat. Wie könnte ich das mit dem gespeicherten Proc machen? Müssten wir benutzerdefinierte Suche und Bestellung schreiben (wir haben Searchlogic verwendet)? Das Management ist nicht in der Lage, die Nachteile der Verwendung eines gespeicherten Procs von Rails zu verstehen; Alles, was sie sagen, ist, dass die aktuelle Methode zu lange dauert, um die Daten zu laden, und dass sie repariert werden muss, aber das Suchen und Filtern sind kritische Funktionen.

BEARBEITEN Ich habe den Code für diese Abfrage hier: Optimizing a strange MySQL Query. Was komisch ist, ist, dass wenn ich diese Abfrage in einer GUI (Navicat) ausführe es in etwa 5 Sekunden läuft, aber auf der Webseite dauert es über eine Minute zu laufen; Die Ansicht ist kompliziert aus Gründen, die ich im ursprünglichen Beitrag skizziere, aber ich würde denken, dass MySQL Ansichten optimiert und zwischenspeichert wie SQL Server (oder vielmehr, wie ich den SQL Server lese), um die Leistung zu verbessern.

+2

Verwendung der gespeicherten Prozedur mit Rails klingt böse ... Finden Sie nicht einen anderen Weg, die Ladezeit zu verbessern? – marcgg

+0

Stimmen Sie mit marcgg überein ... könnten Sie Informationen bereitstellen, damit wir über andere Möglichkeiten nachdenken können, die Leistung zu verbessern? – Ben

+0

Ich stimme zu, dass diese besondere Situation böse klingt, aber das ist eine gute Frage, da Sie nicht immer die Kontrolle über die Datenbank haben. – jamesaharvey

Antwort

4

Sie können gespeicherte Prozeduren von Rails aufrufen, aber Sie werden die meisten Vorteile von ActiveRecord verlieren, da das generierte Standard-SQL nicht funktioniert. Sie können die native Datenbankverbindung verwenden und sie aufrufen, aber es wird eine undichte Abstraktion sein. Vielleicht möchten Sie DataMapper in Betracht ziehen.

Wenn ich auf Ihre letzte Frage zurückblicke, würde ich den DBA dazu bringen, einen Auslöser zu erstellen, um eine relationellere Struktur aus den Daten zu erstellen. Der Auslöser würde die EVA-Daten in eine Tabelle einfügen, was die einzige Möglichkeit ist, materialisierte Ansichten in MySQL zu erstellen. Auf diese Weise zahlen Sie nur geringe zusätzliche Hintergrundkosten beim Einfügen und die Anwendung kann normal ausgeführt werden. Wie dem auch sei

...

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

Aber es gibt eine open ticket out there on lighthouse diesen Ansatz angibt, mit möglicherweise nicht funktionieren einige der Parameter ändern, die Verbindung zu verwenden.

Verwandte Themen