Maior performance no seu sistema
com o uso adequado de
ORM em Rails
Isaac Felisberto de Souza
Engenheiro de Software
...há “quase” 20 anos
no mundo de desenvolvimento
Já somos mais de 100 na área
de desenvolvimento!
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
Vamos usar outra linguagem
Ruby é lento
Vamos fragmentar o sistema
Precisamos reescrever do zero
Será que o problema é a
linguagem ou o framework?
Ou não estamos usando
eles de forma adequada?
ORM
EM
RAILS
Object
Relational
Mapping
Rails nos oferece
Active
Record
Ele é um Pattern!
Martin Fowler
Order
Customer
Order Items
Product
Shipping Company
Delivery
>Order.create(customer:...)
>Order.find(1).customer.name
>Order.find_by(customer:1).order_items.count
>Order.all
class Customer < ApplicationRecord
end
class Delivery < ApplicationRecord
belongs_to :shipping_company
belongs_to :ordem_item
end
class Order < ApplicationRecord
belongs_to :customer
has_many :order_items
end
class OrderItem < ApplicationRecord
belongs_to :order
belongs_to :product
has_one :delivery
end
class Product < ApplicationRecord
end
class ShippingCompany < ApplicationRecord
end
Order Load (1.0ms) SELECT "orders".* FROM
"orders" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Order id: 1,
customer_id: 2, status: "ENTREGUE", ...]>
<table>
<thead>
<tr>
<th>Id</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<% @orders.each do |order| %>
<tr>
<td><%= order.id %></td>
<td><%= order.status %></td>
</tr>
<% end %>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Customer</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<% @orders.each do |order| %>
<tr>
<td><%= order.customer.name %></td>
<td><%= order.status %></td>
</tr>
<% end %>
</tbody>
</table>
Para 10.000 orders, até 10.001 consultas ao banco
(Queries N+1)
def index
@orders = Order.all
end
def index
@orders = Order.all.includes(:customer)
end
2 consultas ao banco de dados
def index
@orders = Order.all.joins(:customer).includes(:customer)
end
1 consulta ao banco de dados
Default
16171ms
9408ms
9574ms
9783ms
17361ms
19387ms
13.6s
Qual melhor estratégia?
Include
1490ms
1440ms
1844ms
1581ms
1555ms
1969ms
1.6s
Join + Include
2044ms
2168ms
1536ms
1903ms
1978ms
1668ms
1.8s
+ db index
1579ms
1653ms
1575ms
1556ms
1613ms
1564ms
1.5s
Como coletar
essas métricas?
Uso do log do rails server
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
Application
Performance
Management (APM)
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
15ms
1ms
https://github.com/newrelic/rpm
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
Porque esses
problemas ocorrem ?
SOLUÇÃO CRESCE !
● FEATURES COMPLEXAS
O TIME CRESCE !!!
● MAPEAMENTOS EQUIVOCADOS
● MAU USO DE NAVEGAÇÃO
ENTRE OBJETOS
● MODELAGEM CONFUSA
Como evitar
esses problemas ?
Bullet
https://github.com/flyerhzm/bullet
DB Query Matchers
https://github.com/brigade/db-query-matchers
teste A
teste B
teste C
teste D
teste E
teste F
teste G
teste H
teste I
teste J
teste K
teste L
require 'rails_helper'
feature 'orders index' do
scenario 'list all' do
expect { visit('/orders') }.to make_database_queries(count: 3)
end
scenario 'list all' do
expect { visit('/orders_include') }.to make_database_queries(count: 2)
end
scenario 'list all' do
expect { visit('/orders_join') }.to make_database_queries(count: 1)
end
end
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
expect { }.to_not make_database_queries(matching: /UPDATE/)
expect { }.to_not make_database_queries
expect { }.to make_database_queries(count: 1)
expect { }.to make_database_queries(count: 0..3)
expect { }.to_not make_database_queries(manipulative: true)
(INSERT, UPDATE, DELETE)
Boas
Práticas
Uso de Scope
def index_with_join
@orders = Order.all.joins(:customer).includes(:customer)
end
Controller
class Order < ApplicationRecord
belongs_to :customer
has_many :order_items
scope :all_with_customer, -> {Order.all.joins(:customer).includes(:customer)}
end
Model
def index_with_join
@orders = Order.all_with_customer
end
Controller
Evite...
scope :all_with_customer, -> {
Order.all.includes(:customer).order(:status)}
Ordenação
default_scope :active, -> {Customer.where(active:true)}Default
scope :closed, -> {Order.where(status:‘closed’)
.where(‘total_amount >= ?’, 10.0)}
Itens
Implícitos
scope :closed, -> do
find_by_sql <<-SQL
select * from orders where status = ‘closed’
SQL
end
SQL puro
Queries customizadas com
Mapeamento Alternativos
class SummaryOrder < ApplicationRecord
self.table_name = "orders"
scope :all_summarized, -> {
select('orders.id')
.select('customers.name')
.select('orders.status')
.select('count(order_items.id) as items_quantity')
.joins('left join customers on orders.customer_id = customers.id')
.joins('right join order_items on order_items.order_id = orders.id')
.group('orders.id, customers.name, orders.status')
}
end
...
<tr>
<th>Customer</th>
<th>Status</th>
<th>Quantity of Items</th>
</tr>
...
<% @summary_orders.each do |summary_order| %>
<tr>
<td><%= summary_order.name %></td>
<td><%= summary_order.status %></td>
<td><%= summary_order.items_quantity %></td>
</tr>
<% end %>
...
class SummaryOrder
attr_accessor :id,
:name,
:status,
:items_quantity
end
TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails
count, length ou size ?
count
length
size
OO ou SQL?
Dê preferência ao uso de OO!
OO não pode sacrificar performance
ORM é um facilitador, conhecer SQL e banco de dados
ainda é importante
Não abra mão do poder do banco de dados
> SummaryOrder.all_summarized.explain
HashAggregate (cost=871.09..971.09 rows=10000 width=57)
Group Key: orders.id, customers.name
-> Hash Left Join (cost=349.70..796.09 rows=10000 width=57)
Hash Cond: (orders.customer_id = customers.id)
-> Hash Left Join (cost=319.00..639.24 rows=10000 width=33)
Hash Cond: (order_items.order_id = orders.id)
-> Seq Scan on order_items (cost=0.00..194.00 rows=10000 width=16)
-> Hash (cost=194.00..194.00 rows=10000 width=25)
-> Seq Scan on orders (cost=0.00..194.00 rows=10000 width=25)
-> Hash (cost=19.20..19.20 rows=920 width=40)
-> Seq Scan on customers (cost=0.00..19.20 rows=920 width=40)
Explain
Vimos resumidamente...
Includes
Joins Scopes
Mapeamentos Alternativos
New Relic Bullet
DB Query Matchers
Queries N+1
Count, Length, Size
Explain
Isso resolve todos
os problemas ?
provavelmente
não!
Talvez ainda seja
necessário...
● Reescrever
● Fragmentar
● Ou até usar outra
linguagem
Faça pelos
motivos adequados!
Verifique se o
problema de performance
não é mal uso de ORM
Obrigado ! Isaac Felisberto de Souza
isaacsouza@gmail.com
linkedin.com/in/isaacfsouza
http://resultadosdigitais.com.br/
trabalhe-conosco/
Seja um RDoer!
Dúvidas ?

More Related Content

PDF
Maior performance no seu sistema com o uso adequado de orm em rails
PPT
PHP 5 + MySQL 5 = A Perfect 10
PPTX
Apex Testing and Best Practices
PPT
PPT
Les06 (using subqueries to solve queries)
PDF
Defensive Apex Programming
PPT
Maior performance no seu sistema com o uso adequado de orm em rails
PHP 5 + MySQL 5 = A Perfect 10
Apex Testing and Best Practices
Les06 (using subqueries to solve queries)
Defensive Apex Programming

What's hot (6)

ODP
Back to basics - PHP_Codesniffer
PDF
10 Principles of Apex Testing
PPTX
Episode 6 - DML, Transaction and Error handling in Salesforce
PPTX
Django ORM - Marcin Markiewicz
PPTX
Apex Flex Queue: Batch Apex Liberated
PPT
TDD, BDD, RSpec
Back to basics - PHP_Codesniffer
10 Principles of Apex Testing
Episode 6 - DML, Transaction and Error handling in Salesforce
Django ORM - Marcin Markiewicz
Apex Flex Queue: Batch Apex Liberated
TDD, BDD, RSpec
Ad

Similar to TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails (20)

PDF
How to avoid hanging yourself with Rails
PPTX
Querying with Rails
KEY
Código Saudável => Programador Feliz - Rs on Rails 2010
DOCX
Ruby on Rails Developer - Allerin
ODP
Ruby on rails
PPTX
Active record(1)
PDF
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
PDF
performance vamos dormir mais?
PPTX
Boosting the Performance of your Rails Apps
PDF
Ajax World2008 Eric Farrar
KEY
Active Record Query Interface (1), Season 2
KEY
Repensando o Desenvolvimento Web com Ruby on Rails
PDF
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
PDF
Contagion的Ruby/Rails投影片
 
PPT
Doctrine 2 - Introduction
PDF
Database Design Patterns
PDF
Intro to-rails-webperf
PDF
Advanced O/R Mapping with Glorp
PPTX
TDC2016POA | Trilha Banco de Dados - RavenDB: um banco de dados NoSQL de segu...
KEY
Onde mora a produtividade do Ruby on Rails?
How to avoid hanging yourself with Rails
Querying with Rails
Código Saudável => Programador Feliz - Rs on Rails 2010
Ruby on Rails Developer - Allerin
Ruby on rails
Active record(1)
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
performance vamos dormir mais?
Boosting the Performance of your Rails Apps
Ajax World2008 Eric Farrar
Active Record Query Interface (1), Season 2
Repensando o Desenvolvimento Web com Ruby on Rails
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Contagion的Ruby/Rails投影片
 
Doctrine 2 - Introduction
Database Design Patterns
Intro to-rails-webperf
Advanced O/R Mapping with Glorp
TDC2016POA | Trilha Banco de Dados - RavenDB: um banco de dados NoSQL de segu...
Onde mora a produtividade do Ruby on Rails?
Ad

More from tdc-globalcode (20)

PDF
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
PDF
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
PDF
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
PDF
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
PDF
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
PDF
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
PDF
TDC2019 Intel Software Day - Inferencia de IA em edge devices
PDF
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
PPT
Trilha .Net - Programacao funcional usando f#
PDF
TDC2018SP | Trilha Go - Case Easylocus
PDF
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
PDF
TDC2018SP | Trilha Go - Clean architecture em Golang
PDF
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
PDF
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
PDF
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
PDF
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
PDF
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
PDF
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
PDF
TDC2018SP | Trilha .Net - .NET funcional com F#
PDF
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - Inferencia de IA em edge devices
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha .Net - Programacao funcional usando f#
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core

Recently uploaded (20)

PDF
MBA _Common_ 2nd year Syllabus _2021-22_.pdf
PDF
My India Quiz Book_20210205121199924.pdf
PDF
FOISHS ANNUAL IMPLEMENTATION PLAN 2025.pdf
PDF
Complications of Minimal Access-Surgery.pdf
PDF
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
medical_surgical_nursing_10th_edition_ignatavicius_TEST_BANK_pdf.pdf
PDF
Τίμαιος είναι φιλοσοφικός διάλογος του Πλάτωνα
DOCX
Cambridge-Practice-Tests-for-IELTS-12.docx
PDF
Uderstanding digital marketing and marketing stratergie for engaging the digi...
PDF
CISA (Certified Information Systems Auditor) Domain-Wise Summary.pdf
PDF
احياء السادس العلمي - الفصل الثالث (التكاثر) منهج متميزين/كلية بغداد/موهوبين
PDF
FORM 1 BIOLOGY MIND MAPS and their schemes
PPTX
Share_Module_2_Power_conflict_and_negotiation.pptx
PDF
ChatGPT for Dummies - Pam Baker Ccesa007.pdf
PDF
Empowerment Technology for Senior High School Guide
PPTX
ELIAS-SEZIURE AND EPilepsy semmioan session.pptx
PDF
Weekly quiz Compilation Jan -July 25.pdf
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PDF
BP 704 T. NOVEL DRUG DELIVERY SYSTEMS (UNIT 2).pdf
MBA _Common_ 2nd year Syllabus _2021-22_.pdf
My India Quiz Book_20210205121199924.pdf
FOISHS ANNUAL IMPLEMENTATION PLAN 2025.pdf
Complications of Minimal Access-Surgery.pdf
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
Chinmaya Tiranga quiz Grand Finale.pdf
medical_surgical_nursing_10th_edition_ignatavicius_TEST_BANK_pdf.pdf
Τίμαιος είναι φιλοσοφικός διάλογος του Πλάτωνα
Cambridge-Practice-Tests-for-IELTS-12.docx
Uderstanding digital marketing and marketing stratergie for engaging the digi...
CISA (Certified Information Systems Auditor) Domain-Wise Summary.pdf
احياء السادس العلمي - الفصل الثالث (التكاثر) منهج متميزين/كلية بغداد/موهوبين
FORM 1 BIOLOGY MIND MAPS and their schemes
Share_Module_2_Power_conflict_and_negotiation.pptx
ChatGPT for Dummies - Pam Baker Ccesa007.pdf
Empowerment Technology for Senior High School Guide
ELIAS-SEZIURE AND EPilepsy semmioan session.pptx
Weekly quiz Compilation Jan -July 25.pdf
202450812 BayCHI UCSC-SV 20250812 v17.pptx
BP 704 T. NOVEL DRUG DELIVERY SYSTEMS (UNIT 2).pdf

TDC2018SP | Trilha Ruby - Maior performance no seu sistema com o uso adequado de ORM em Rails