2015-01-05 2 views
2

Я выполняю запрос, который содержит или объединяет связку Q и, похоже, занимает много времени. Вот некоторые псевдо-кодВлияние производительности объектов Q в запросе django

query_params = [] 
for i in range(80): #there are about 80ish Q objects being created 
    query_params.append(Q(filter_stuff)) 

Тогда я или они все вместе

query_params = reduce(or_, query_params) 

И когда я выполнить запрос

query = list(MyModel.objects.filter(query_params)) 

Он висит в течение длительного времени. Я знаю, что это довольно общий вопрос, и трудно дать диагностику без глубокого понимания структуры данных (что было бы трудно дать здесь). Но мне просто любопытно, есть ли какие-либо последствия для производительности объектов Q в запросе django.

+1

ваш разговор о oring tog эфир 80 условий, которые будут медленными, независимо от того, что ... Я бы рекомендовал выяснить, какой способ запросить нужные записи. –

+0

@doniyor Нет модели, у которой мало полей, но я пытаюсь найти определенные пары из них (т. q1 = Q (field1 = val1, field2 = val2), q2 = Q (field1 = val3, field2 = val4) и т. д.) – sedavidw

+1

Я бы предложил создать индекс спаривания. –

ответ

1

Удалось значительно уменьшить длину запроса, уменьшив количество объектов Q. Все они были в формате, как:

q1 = Q(field1=field1_val1, field2=field2_val1) 
q2 = Q(filed1=field1_val2, field2=field2_val2) 
#...etc 

Я закончил тем, группируя их по FIELD1 значений:

q_dict = {field1_val1: [all field_2 values paired with field1_val1], ...} 

Тогда мои Q объекты выглядели так:

for field1_val, field2_vals = q_dict.items(): 
    query_params.append(Q(field1=field1_val, field2__in=field2_vals)) 

Это в конечном счете сократился вниз мой номер Q объектов значительно и запрос бежал намного быстрее

Смежные вопросы