Reduzindo e vendo as queries executadas pelo Django


O Django é meio “safadinho”… hehe por baixo dos panos ele executa somente uma query de cada vez quando solicitado, causando assim um grande número de acessos ao banco, sem que saibamos.

Veja um exemplo bem simples:

class Fabricande(models.Model):
    nome = models.CharField(max_length=100)

class Carro(models.Model):
    titulo = models.CharField(max_length=100)
    fabricante = models.ForeignKey(Fabricante)

Ok ! Então vamos agora exemplificar uma busca de registros nestes models

c = Carro.objects.get(id=3)
f = c.fabricante.nome

Legal. Funciona corretamente, e temos o nome do fabricante certinho, porém se formos ver as queries executadas pelo django, notaremos que foram executadas 2 queries:
PS: Note abaixo como se faz para ver as queries executadas pelo Django.

from django.db import connection
print connection.queries
[{'time': 'x.xx',sql: 'select ... from app_carro where ...'},
{'time': 'x.xx',sql: 'select ... from app_fabricante where ...'}]

Porém se mudarmos um pequeno detalhe na nossa busca vamos reduzir o número de queries  de 2 para 1 ( irrelevante neste pequeno exemplo porém muito relevante quando temos muitas FKs e muitos dados ) diminuindo assim o número de acessos ao banco de dados, que muitas vezes é gargalo em uma aplicação, assim:

c = Carro.objects.select_related().get(id=3)
f = c.fabricante.nome

E nossas queries ficarão unidas em uma só através das chaves corretas:

print connection.queries
[{'time': 'x.xx',sql: 'select ... from  app_carro inner join app_fabricante on AA = BB where ...'}]

Beleza !

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s