执行 'AND' 查询时的特殊 QuerySet 行为
Peculiar QuerySet behaviour when doing an 'AND' query
我在进行查询时有一些奇怪的行为。使用 "AND" 过滤器时,查询完成后需要大约 20-30 秒才能呈现到屏幕上。
以下是我一直用来尝试隔离问题的测试函数。
def reports_question_detail(request, q_id):
question = get_object_or_404(promo_models.Question, pk=q_id)
import time
start_time = time.time()
question_answers = promo_models.QuestionAnswers.objects
.filter(question=q_id, promotion__workflow_status=6)
.values('questionoption').annotate(Count('id'))
print (time.time() - start_time)
return HttpResponse(question_answers)
我已经尝试换出过滤器查询,检查生成的 SQL 并计算执行时间。
- 过滤器(问题=q_id)
- 过滤器(promotion__workflow_status=6)
- 过滤器(问题=q_id,promotion__workflow_status=6)
我原以为第三个查询会花费更长的时间,但实际上这 3 个查询中的每一个都与 运行 花费的时间几乎完全相同。但是,在执行完成并且调试打印显示时间后,第三个查询在执行后又需要 20 秒左右才能呈现到屏幕上。
然后我想知道返回的 Queryset 是否有问题,并尝试通过更改以下行来忽略结果:
HttpResponse("Finished!")
... 立即呈现到屏幕上的所有查询。
最后,我想知道返回的 Queryset 之间是否有任何差异,并尝试转储所有属性。前两个查询的查询集将它们的属性快速转储到控制台,但第三个查询时断断续续,每行大约需要 20-30 秒。
我现在有点不知所措了。谁能建议我如何进一步调查这个问题?
查询集是惰性的。调用 filter
实际上不会对数据库进行任何调用:这些调用仅在迭代查询集时进行。因此,您的 time
调用仅测量定义查询集对象所花费的时间。
我在进行查询时有一些奇怪的行为。使用 "AND" 过滤器时,查询完成后需要大约 20-30 秒才能呈现到屏幕上。
以下是我一直用来尝试隔离问题的测试函数。
def reports_question_detail(request, q_id):
question = get_object_or_404(promo_models.Question, pk=q_id)
import time
start_time = time.time()
question_answers = promo_models.QuestionAnswers.objects
.filter(question=q_id, promotion__workflow_status=6)
.values('questionoption').annotate(Count('id'))
print (time.time() - start_time)
return HttpResponse(question_answers)
我已经尝试换出过滤器查询,检查生成的 SQL 并计算执行时间。
- 过滤器(问题=q_id)
- 过滤器(promotion__workflow_status=6)
- 过滤器(问题=q_id,promotion__workflow_status=6)
我原以为第三个查询会花费更长的时间,但实际上这 3 个查询中的每一个都与 运行 花费的时间几乎完全相同。但是,在执行完成并且调试打印显示时间后,第三个查询在执行后又需要 20 秒左右才能呈现到屏幕上。
然后我想知道返回的 Queryset 是否有问题,并尝试通过更改以下行来忽略结果:
HttpResponse("Finished!")
... 立即呈现到屏幕上的所有查询。
最后,我想知道返回的 Queryset 之间是否有任何差异,并尝试转储所有属性。前两个查询的查询集将它们的属性快速转储到控制台,但第三个查询时断断续续,每行大约需要 20-30 秒。
我现在有点不知所措了。谁能建议我如何进一步调查这个问题?
查询集是惰性的。调用 filter
实际上不会对数据库进行任何调用:这些调用仅在迭代查询集时进行。因此,您的 time
调用仅测量定义查询集对象所花费的时间。