Optimisation des requêtes Rails complexes avec Raw SQL
Le déploiement d'applications Rails, en particulier sur des plates-formes comme Heroku, peut parfois révéler des goulots d'étranglement en termes de performances résultant de requêtes de bases de données complexes. Cet article montre comment l'utilisation du SQL brut peut améliorer considérablement l'efficacité de ces requêtes.
Exploiter le SQL brut dans Rails
Rails fournit un mécanisme pour exécuter directement du SQL personnalisé. Cela contourne le générateur de requêtes ActiveRecord, ce qui entraîne souvent des temps d'exécution plus rapides. Voici le processus :
ActiveRecord::Base.connection.execute
pour exécuter la requête sur la base de données.Exemple illustratif
Examinons un scénario impliquant des tables jointes et un classement :
<code class="language-ruby">@payments = PaymentDetail.joins(:project).order('payment_details.created_at desc') @payment_errors = PaymentError.joins(:project).order('payment_errors.created_at desc') @all_payments = (@payments + @payment_errors)</code>
Ce code rejoint les tables PaymentDetail
et PaymentError
, en classant les résultats par horodatage created_at
. Le SQL brut équivalent est :
<code class="language-sql">sql = "SELECT * FROM payment_details pd LEFT JOIN projects p ON pd.project_id = p.id UNION ALL SELECT * FROM payment_errors pe LEFT JOIN projects p ON pe.project_id = p.id ORDER BY created_at DESC"</code>
L'exécution est alors simple :
<code class="language-ruby">records_array = ActiveRecord::Base.connection.execute(sql)</code>
Gains de performances
L'utilisation de SQL brut élimine la surcharge liée à la génération de requêtes Active Record de Rails, ce qui peut potentiellement conduire à des améliorations substantielles des performances, en particulier avec de grands ensembles de données. Le records_array
peut être traité comme n'importe quel tableau Ruby, permettant une intégration transparente dans la logique de votre application. Cette technique est particulièrement utile lorsqu'il s'agit de requêtes complexes sujettes à des délais d'attente.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!