9. INCLUDE
for list in List.all
... do some ...
for contact in list.contacts
... do some ...
end
end
10. INCLUDE
for list in List.all(:include => :contacts)
... do some ...
for contacts in list.contacts
... do some ...
end
end
11. ÍNDICES
Rails não adiciona índices nas
tabelas
EXPLAIN ANALYZE SELECT * FROM contacts WHERE
email = 'foo@bar.com';>> cost=0.00..25.38CREATE INDEX
contacts_email_idx ON contacts(email);>> cost=0.00..1.06
12. TABELAS CONSOLIDADAS
Newsletter#history
>> Buscava dados de mais de 100 mensagens (total de envios,
acessos, cliques, descadastros, informações geográficas...) em uma
view e apresentava um gráfico.
Tempo médio do método: 18s
CREATE TABLE messages_complete_history AS SELECT *
FROM view_messages_complete_history;
Tempo médio do método: 0.3s
>> Criação agendada para a madrugada com BackgroundRB
13. CSV EXPORT
COPY (SELECT * FROM contacts) TO 'path' WITH
DELIMITER ';' CSV HEADER
Muitas ordens de magnitude mais
rápido do que AR + FasterCSV
14. WORKING ON
postgres_timestamps plugin
sobrescreve comportamento de created_at e updated_at do
AR
cria defaults e triggers automaticamente nas migrações
benchmarks que fiz: de 2 a 5% mais rápido em 1000 inserts.
até 10% mais rápido em 1000 updates;
>> Prometo para ainda este ano!
24. FRAGMENT CACHE
# some view
- cache :action_suffix => 'comments' do
= render :partial => 'comments'
# no controller...
def create_comment
...
expire_fragment :action => 'show_post',
:action_suffix => 'comments'
end
25. FRAGMENT CACHE
# some view
- cache :key => @contact.updated_at do
= render :partial => 'contact_info'
# Expira automático, mas gera alguns arquivos
...
32. Pode executar tarefas em bg;
Pode agendar tarefas para
executar em bg;
Pode executar tarefas
periodicamente em bg;
Pode até conversar via TCP;
33. EXECUTANDO UMA TAREFA
class ContactsWorker < BackgrounDRb::MetaWorker
set_worker_name :contacts_worker
def delete(args)
total = args[:contacts].size
cache[:total] = total
cache[:curr] = 0
cache[:msg] = Contact.delete_many(args[:contacts]) do
cache[:curr] += 1
end
end
end
# start worker on controller
MiddleMan.worker(:contacts_worker).async_delete(:args =>
{:contacts => @contacts}, :job_key => @job_key)
# verify worker status via Ajax
t = MiddleMan.worker(:contacts_worker).ask_result(:total)
c = MiddleMan.worker(:contacts_worker).ask_result(:curr)
return render :json => [t, c]
34. EXECUTANDO UMA TAREFA
Média antes: 13s (muitas FKs!
milhares de contatos!)
Média depois: 0.1s (usuário pode
trabalhar durante processo)